mirror of
https://github.com/postgres/postgres.git
synced 2025-07-11 10:01:57 +03:00
Updated pg_dumpall and psql to preserve database owners.
This commit is contained in:
@ -12,25 +12,27 @@ then
|
|||||||
else
|
else
|
||||||
BS='\\' # System V
|
BS='\\' # System V
|
||||||
fi
|
fi
|
||||||
psql -l -A -q -t| tr '|' ' ' | grep -v '^template1 ' | \
|
|
||||||
while read DATABASE USERID USER
|
|
||||||
do
|
|
||||||
echo "${BS}connect template1"
|
|
||||||
echo "create database $DATABASE;"
|
|
||||||
echo "${BS}connect $DATABASE"
|
|
||||||
pg_dump "$@" $DATABASE
|
|
||||||
done
|
|
||||||
echo "${BS}connect template1"
|
|
||||||
echo "copy pg_user from stdin;"
|
|
||||||
#
|
#
|
||||||
# Dump everyone but the postgres user
|
# Dump everyone but the postgres user
|
||||||
# initdb creates him
|
# initdb creates him
|
||||||
#
|
#
|
||||||
|
# get the postgres user id
|
||||||
|
#
|
||||||
POSTGRES_SUPER_USER_ID="`psql -A -q -t template1 <<END
|
POSTGRES_SUPER_USER_ID="`psql -A -q -t template1 <<END
|
||||||
select datdba
|
select datdba
|
||||||
from pg_database
|
from pg_database
|
||||||
where datname = 'template1';
|
where datname = 'template1';
|
||||||
END`"
|
END`"
|
||||||
|
echo "${BS}connect template1"
|
||||||
|
#
|
||||||
|
# delete all users in case they run this twice
|
||||||
|
#
|
||||||
|
echo "delete from pg_user"
|
||||||
|
echo "where usesysid <> $POSTGRES_SUPER_USER_ID;"
|
||||||
|
#
|
||||||
|
# load all the non-postgres users
|
||||||
|
#
|
||||||
|
echo "copy pg_user from stdin;"
|
||||||
psql -q template1 <<END
|
psql -q template1 <<END
|
||||||
select pg_user.* into table tmp_pg_user
|
select pg_user.* into table tmp_pg_user
|
||||||
from pg_user
|
from pg_user
|
||||||
@ -39,3 +41,18 @@ copy tmp_pg_user to stdout;
|
|||||||
drop table tmp_pg_user;
|
drop table tmp_pg_user;
|
||||||
END
|
END
|
||||||
echo "${BS}."
|
echo "${BS}."
|
||||||
|
psql -l -A -q -t| tr '|' ' ' | grep -v '^template1 ' | \
|
||||||
|
while read DATABASE PGUSERID DATAPATH
|
||||||
|
do
|
||||||
|
POSTGRES_USER="`psql -A -q -t template1 <<END
|
||||||
|
select usename
|
||||||
|
from pg_user
|
||||||
|
where usesysid = $PGUSERID;
|
||||||
|
END`"
|
||||||
|
|
||||||
|
echo "${BS}connect template1 $POSTGRES_USER"
|
||||||
|
echo "create database $DATABASE;"
|
||||||
|
echo "${BS}connect $DATABASE $POSTGRES_USER"
|
||||||
|
pg_dump "$@" $DATABASE
|
||||||
|
done
|
||||||
|
# done
|
||||||
|
@ -7,11 +7,12 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/bin/psql/Attic/psql.c,v 1.59 1997/04/10 11:54:29 scrappy Exp $
|
* $Header: /cvsroot/pgsql/src/bin/psql/Attic/psql.c,v 1.60 1997/05/21 03:12:02 momjian Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
@ -155,7 +156,7 @@ slashUsage(PsqlSettings * ps)
|
|||||||
fprintf(stderr, " \\? -- help\n");
|
fprintf(stderr, " \\? -- help\n");
|
||||||
fprintf(stderr, " \\a -- toggle field-alignment (currenty %s)\n", on(ps->opt.align));
|
fprintf(stderr, " \\a -- toggle field-alignment (currenty %s)\n", on(ps->opt.align));
|
||||||
fprintf(stderr, " \\C [<captn>] -- set html3 caption (currently '%s')\n", ps->opt.caption ? ps->opt.caption : "");
|
fprintf(stderr, " \\C [<captn>] -- set html3 caption (currently '%s')\n", ps->opt.caption ? ps->opt.caption : "");
|
||||||
fprintf(stderr, " \\connect <dbname> -- connect to new database (currently '%s')\n", PQdb(ps->db));
|
fprintf(stderr, " \\connect <dbname> <user> -- connect to new database (currently '%s')\n", PQdb(ps->db));
|
||||||
fprintf(stderr, " \\copy table {from | to} <fname>\n");
|
fprintf(stderr, " \\copy table {from | to} <fname>\n");
|
||||||
fprintf(stderr, " \\d [<table>] -- list tables in database or columns in <table>, * for all\n");
|
fprintf(stderr, " \\d [<table>] -- list tables in database or columns in <table>, * for all\n");
|
||||||
fprintf(stderr, " \\e [<fname>] -- edit the current query buffer or <fname>, \\E execute too\n");
|
fprintf(stderr, " \\e [<fname>] -- edit the current query buffer or <fname>, \\E execute too\n");
|
||||||
@ -825,7 +826,9 @@ do_copy(const char *args, PsqlSettings * settings)
|
|||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
do_connect(const char *new_dbname, PsqlSettings * settings)
|
do_connect(const char *new_dbname,
|
||||||
|
const char *new_user,
|
||||||
|
PsqlSettings * settings)
|
||||||
{
|
{
|
||||||
|
|
||||||
char *dbname = PQdb(settings->db);
|
char *dbname = PQdb(settings->db);
|
||||||
@ -833,11 +836,26 @@ do_connect(const char *new_dbname, PsqlSettings * settings)
|
|||||||
fprintf(stderr, "\\connect must be followed by a database name\n");
|
fprintf(stderr, "\\connect must be followed by a database name\n");
|
||||||
else {
|
else {
|
||||||
PGconn *olddb = settings->db;
|
PGconn *olddb = settings->db;
|
||||||
|
char *userenv;
|
||||||
|
|
||||||
printf("closing connection to database: %s\n", dbname);
|
printf("closing connection to database: %s\n", dbname);
|
||||||
|
if (new_user != NULL) {
|
||||||
|
/*
|
||||||
|
PQsetdb() does not allow us to specify the user,
|
||||||
|
so we have to do it via PGUSER
|
||||||
|
*/
|
||||||
|
userenv = malloc(strlen("PGUSER=") + strlen(new_user) + 1);
|
||||||
|
sprintf(userenv,"PGUSER=%s",new_user);
|
||||||
|
putenv(userenv);
|
||||||
|
free(userenv);
|
||||||
|
}
|
||||||
settings->db = PQsetdb(PQhost(olddb), PQport(olddb),
|
settings->db = PQsetdb(PQhost(olddb), PQport(olddb),
|
||||||
NULL, NULL, new_dbname);
|
NULL, NULL, new_dbname);
|
||||||
|
if (!new_user)
|
||||||
printf("connecting to new database: %s\n", new_dbname);
|
printf("connecting to new database: %s\n", new_dbname);
|
||||||
|
else
|
||||||
|
printf("connecting to new database: %s as user: %s\n",
|
||||||
|
new_dbname,new_user);
|
||||||
if (PQstatus(settings->db) == CONNECTION_BAD) {
|
if (PQstatus(settings->db) == CONNECTION_BAD) {
|
||||||
fprintf(stderr, "%s\n", PQerrorMessage(settings->db));
|
fprintf(stderr, "%s\n", PQerrorMessage(settings->db));
|
||||||
printf("reconnecting to %s\n", dbname);
|
printf("reconnecting to %s\n", dbname);
|
||||||
@ -1037,12 +1055,19 @@ HandleSlashCmds(PsqlSettings * settings,
|
|||||||
* assuming it's not a one-character command. If it's a one-character
|
* assuming it's not a one-character command. If it's a one-character
|
||||||
* command, this is meaningless.
|
* command, this is meaningless.
|
||||||
*/
|
*/
|
||||||
|
char *optarg3;
|
||||||
|
/*
|
||||||
|
* Pointer inside the second <cmd> string to the argument of the slash command
|
||||||
|
* assuming it's not a one-character command. If it's a one-character
|
||||||
|
* command, this is meaningless.
|
||||||
|
*/
|
||||||
char *cmd;
|
char *cmd;
|
||||||
/*
|
/*
|
||||||
* String: value of the slash command, less the slash and with escape
|
* String: value of the slash command, less the slash and with escape
|
||||||
* sequences decoded.
|
* sequences decoded.
|
||||||
*/
|
*/
|
||||||
int blank_loc;
|
int blank_loc;
|
||||||
|
int blank_loc2;
|
||||||
/* Offset within <cmd> of first blank */
|
/* Offset within <cmd> of first blank */
|
||||||
|
|
||||||
cmd = malloc(strlen(line)); /* unescaping better not make string grow. */
|
cmd = malloc(strlen(line)); /* unescaping better not make string grow. */
|
||||||
@ -1064,11 +1089,19 @@ HandleSlashCmds(PsqlSettings * settings,
|
|||||||
optarg = NULL;
|
optarg = NULL;
|
||||||
|
|
||||||
blank_loc = strcspn(cmd, " \t");
|
blank_loc = strcspn(cmd, " \t");
|
||||||
if (blank_loc == 0)
|
if (blank_loc == 0) {
|
||||||
optarg2 = NULL;
|
optarg2 = NULL;
|
||||||
else
|
optarg3 = NULL;
|
||||||
|
} else {
|
||||||
optarg2 = cmd + blank_loc + strspn(cmd + blank_loc, " \t");
|
optarg2 = cmd + blank_loc + strspn(cmd + blank_loc, " \t");
|
||||||
|
blank_loc2 = strcspn(optarg2, " \t");
|
||||||
|
if (blank_loc2 == 0 || *(optarg2 + blank_loc2) == '\0')
|
||||||
|
optarg3 = NULL;
|
||||||
|
else {
|
||||||
|
optarg3 = optarg2 + blank_loc2 + strspn(optarg2 + blank_loc2, " \t");
|
||||||
|
*(optarg2 + blank_loc2) = '\0';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
switch (cmd[0]) {
|
switch (cmd[0]) {
|
||||||
case 'a': /* toggles to align fields on output */
|
case 'a': /* toggles to align fields on output */
|
||||||
@ -1092,9 +1125,9 @@ HandleSlashCmds(PsqlSettings * settings,
|
|||||||
if (strncmp(cmd, "copy ", strlen("copy ")) == 0)
|
if (strncmp(cmd, "copy ", strlen("copy ")) == 0)
|
||||||
do_copy(optarg2, settings);
|
do_copy(optarg2, settings);
|
||||||
else if (strncmp(cmd, "connect ", strlen("connect ")) == 0)
|
else if (strncmp(cmd, "connect ", strlen("connect ")) == 0)
|
||||||
do_connect(optarg2, settings);
|
do_connect(optarg2, optarg3, settings);
|
||||||
else
|
else
|
||||||
do_connect(optarg, settings);
|
do_connect(optarg, optarg2, settings);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'd': /* \d describe tables or columns in a table */
|
case 'd': /* \d describe tables or columns in a table */
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
.\" This is -*-nroff-*-
|
.\" This is -*-nroff-*-
|
||||||
.\" XXX standard disclaimer belongs here....
|
.\" XXX standard disclaimer belongs here....
|
||||||
.\" $Header: /cvsroot/pgsql/src/man/Attic/psql.1,v 1.7 1997/04/10 11:58:59 scrappy Exp $
|
.\" $Header: /cvsroot/pgsql/src/man/Attic/psql.1,v 1.8 1997/05/21 03:12:23 momjian Exp $
|
||||||
.TH PSQL UNIX 1/20/96 PostgreSQL PostgreSQL
|
.TH PSQL UNIX 1/20/96 PostgreSQL PostgreSQL
|
||||||
.SH NAME
|
.SH NAME
|
||||||
psql \(em run the interactive query front-end
|
psql \(em run the interactive query front-end
|
||||||
@ -258,7 +258,7 @@ You should anyway.
|
|||||||
Toggle field alignment when printing out table elements.
|
Toggle field alignment when printing out table elements.
|
||||||
.IP "\eC \fIcaption\fR"
|
.IP "\eC \fIcaption\fR"
|
||||||
Set the HTML3.0 table caption.
|
Set the HTML3.0 table caption.
|
||||||
.IP "\econnect \fIdbname\fR"
|
.IP "\econnect \fIdbname\fR \fIusername\fR"
|
||||||
Establish a connection to a new database. The previous connection is closed.
|
Establish a connection to a new database. The previous connection is closed.
|
||||||
.IP "\ecopy \fItable\fR {FROM | TO} \fIfilename\fR"
|
.IP "\ecopy \fItable\fR {FROM | TO} \fIfilename\fR"
|
||||||
Perform a frontend copy. This is an operation that runs a SQL COPY command,
|
Perform a frontend copy. This is an operation that runs a SQL COPY command,
|
||||||
|
Reference in New Issue
Block a user