<!--
-$Header: /cvsroot/pgsql/doc/src/sgml/ref/pg_dump.sgml,v 1.64 2003/09/11 21:42:20 momjian Exp $
+$Header: /cvsroot/pgsql/doc/src/sgml/ref/pg_dump.sgml,v 1.65 2003/09/23 22:48:53 tgl Exp $
PostgreSQL documentation
-->
<term><option>--no-owner</option></term>
<listitem>
<para>
- Do not output commands to set the
- object ownership to match the original database. Typically,
- <application>pg_dump</application> issues
- (<application>psql</application>-specific) <command>\connect</command>
- statements to set ownership of schema elements. See also
- under <option>-R</option> and <option>-X
- use-set-session-authorization</option>. Note that
- <option>-O</option> does not prevent all reconnections to the
- database, only the ones that are exclusively used for
- ownership adjustments.
+ Do not output commands to set
+ ownership of objects to match the original database.
+ By default, <application>pg_dump</application> issues
+ <command>SET SESSION AUTHORIZATION</command>
+ statements to set ownership of created schema elements.
+ These statements
+ will fail when the script is run unless it is started by a superuser
+ (or the same user that owns all of the objects in the script).
+ To make a script that can be restored by any user, but will give
+ that user ownership of all the objects, specify <option>-O</>.
</para>
<para>
<term><option>--no-reconnect</option></term>
<listitem>
<para>
- Prohibit <application>pg_dump</application>
- from outputting a script that would require reconnections to
- the database while being restored. An average restoration
- script usually has to reconnect several times as different
- users to set the original ownerships of the objects. This
- option is a rather blunt instrument because it makes
- <application>pg_dump</application> lose this ownership information,
- <emphasis>unless</emphasis> you use the <option>-X
- use-set-session-authorization</option> option.
- </para>
-
- <para>
- One possible reason why reconnections during restore might not
- be desired is if the access to the database requires manual
- interaction (e.g., passwords).
- </para>
-
- <para>
- This option is only meaningful for the plain-text format. For
- the other formats, you may specify the option when you
- call <command>pg_restore</command>.
+ This option is obsolete but still accepted for backwards
+ compatibility.
</para>
</listitem>
</varlistentry>
<para>
Specify the superuser user name to use when disabling triggers.
This is only relevant if <option>--disable-triggers</> is used.
- (Usually, it's better to specify
- <option>--use-set-session-authorization</>, and then start the
+ (Usually, it's better to leave this out, and instead start the
resulting script as superuser.)
</para>
</listitem>
<term><option>--use-set-session-authorization</></term>
<listitem>
<para>
- Normally, if a (plain-text mode) script generated by
- <application>pg_dump</application> must alter the current database
- user (e.g., to set correct object ownerships), it uses the
- <application>psql</application> <command>\connect</command> command.
- This command actually opens a new connection, which might
- require manual interaction (e.g., passwords). If you use the
- <option>-X use-set-session-authorization</option> option, then
- <application>pg_dump</application> will instead output <xref
- linkend="sql-set-session-authorization" endterm="sql-set-session-authorization-title"> commands. This has
- the same effect, but it requires that the user restoring the
- database from the generated script be a database superuser.
- This option effectively overrides the <option>-R</option>
- option.
- </para>
-
- <para>
- Since <xref linkend="sql-set-session-authorization" endterm="sql-set-session-authorization-title"> is a
- standard SQL command, whereas <command>\connect</command> only
- works in <application>psql</application>, this option also enhances
- the theoretical portability of the output script.
- </para>
-
- <para>
- This option is only meaningful for the plain-text format. For
- the other formats, you may specify the option when you
- call <command>pg_restore</command>.
+ This option is obsolete but still accepted for backwards
+ compatibility.
+ <application>pg_dump</application> now always behaves in the
+ way formerly selected by this option.
</para>
</listitem>
</varlistentry>
<para>
Presently, the commands emitted for <option>--disable-triggers</>
must be done as superuser. So, you should also specify
- a superuser name with <option>-S</>, or preferably specify
- <option>--use-set-session-authorization</> and then be careful to
- start the resulting script as a superuser. If you give neither
- option, the entire script must be run as superuser.
+ a superuser name with <option>-S</>, or preferably be careful to
+ start the resulting script as a superuser.
</para>
<para>
-<!-- $Header: /cvsroot/pgsql/doc/src/sgml/ref/pg_restore.sgml,v 1.42 2003/09/11 21:42:20 momjian Exp $ -->
+<!-- $Header: /cvsroot/pgsql/doc/src/sgml/ref/pg_restore.sgml,v 1.43 2003/09/23 22:48:53 tgl Exp $ -->
<refentry id="APP-PGRESTORE">
<refmeta>
<term><option>--no-owner</option></term>
<listitem>
<para>
- Prevent any attempt to restore original object
- ownership. Objects will be owned by the user name used to
- attach to the database. See also under <option>-R</option> and
- <option>-X use-set-session-authorization</option>.
+ Do not output commands to set
+ ownership of objects to match the original database.
+ By default, <application>pg_restore</application> issues
+ <command>SET SESSION AUTHORIZATION</command>
+ statements to set ownership of created schema elements.
+ These statements will fail unless the initial connection to the
+ database is made by a superuser
+ (or the same user that owns all of the objects in the script).
+ With <option>-O</option>, any user name can be used for the
+ initial connection, and this user will own all the created objects.
</para>
</listitem>
</varlistentry>
<term><option>--no-reconnect</option></term>
<listitem>
<para>
- While restoring an archive, <application>pg_restore</application>
- typically has to reconnect to the database several times with
- different user names to set the correct ownership of the
- created objects. If this is undesirable (e.g., because manual
- interaction (passwords) would be necessary for each
- reconnection), this option prevents
- <application>pg_restore</application> from issuing any reconnection
- requests. (A connection request while in plain text mode, not
- connected to a database, is made by putting out a <xref
- linkend="app-psql"> <command>\connect</command> command.)
- However, this option is a rather blunt instrument because it
- makes <application>pg_restore</application> lose all object ownership
- information, <emphasis>unless</emphasis> you use the
- <option>-X use-set-session-authorization</option> option.
+ This option is obsolete but still accepted for backwards
+ compatibility.
</para>
</listitem>
</varlistentry>
<term><option>--use-set-session-authorization</option></term>
<listitem>
<para>
- Normally, if restoring an archive requires altering the
- current database user (e.g., to set correct object
- ownerships), a new connection to the database must be opened,
- which might require manual interaction (e.g., passwords). If
- you use the <option>-X use-set-session-authorization</option> option,
- then <application>pg_restore</application> will instead use the <xref
- linkend="sql-set-session-authorization" endterm="sql-set-session-authorization-title"> command. This has
- the same effect, but it requires that the user restoring the
- archive is a database superuser. This option effectively
- overrides the <option>-R</option> option.
+ This option is obsolete but still accepted for backwards
+ compatibility.
+ <application>pg_restore</application> now always behaves in the
+ way formerly selected by this option.
</para>
</listitem>
</varlistentry>
Presently, the commands emitted for
<option>--disable-triggers</> must be done as superuser. So, you
should also specify a superuser name with <option>-S</>, or
- preferably specify <option>--use-set-session-authorization</> and
- run <application>pg_restore</application> as a
+ preferably run <application>pg_restore</application> as a
<productname>PostgreSQL</> superuser.
</para>
</listitem>
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup.h,v 1.25 2003/08/28 20:21:34 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup.h,v 1.26 2003/09/23 22:48:53 tgl Exp $
*
*-------------------------------------------------------------------------
*/
typedef struct _restoreOptions
{
int create; /* Issue commands to create the database */
- int noOwner; /* Don't reconnect to database to match
- * original object owner */
- int noReconnect; /* Don't reconnect to database under any
- * cirsumstances */
- int use_setsessauth;/* use SET SESSSION AUTHORIZATION instead
- * of \connect */
+ int noOwner; /* Don't try to match original object owner */
int disable_triggers; /* disable triggers during
* data-only restore */
char *superuser; /* Username to use as superuser */
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_archiver.c,v 1.75 2003/08/28 20:21:34 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_archiver.c,v 1.76 2003/09/23 22:48:53 tgl Exp $
*
*-------------------------------------------------------------------------
*/
static int _printTocEntry(ArchiveHandle *AH, TocEntry *te, RestoreOptions *ropt, bool isData);
static void _doSetSessionAuth(ArchiveHandle *AH, const char *user);
-static void _reconnectAsOwner(ArchiveHandle *AH, const char *dbname, TocEntry *te);
-static void _reconnectAsUser(ArchiveHandle *AH, const char *dbname, const char *user);
+static void _reconnectToDB(ArchiveHandle *AH, const char *dbname, const char *user);
+static void _becomeUser(ArchiveHandle *AH, const char *user);
+static void _becomeOwner(ArchiveHandle *AH, TocEntry *te);
static void _selectOutputSchema(ArchiveHandle *AH, const char *schemaName);
static teReqs _tocEntryRequired(TocEntry *te, RestoreOptions *ropt);
* initially connected to, not the one we will create, which is very
* bad...
*/
-
- if (ropt->create && ropt->noReconnect)
- die_horribly(AH, modulename, "-C and -R are incompatible options\n");
-
if (ropt->create && ropt->dropSchema)
die_horribly(AH, modulename, "-C and -c are incompatible options\n");
/* We want the schema */
ahlog(AH, 1, "dropping %s %s\n", te->desc, te->tag);
/* Select owner and schema as necessary */
- _reconnectAsOwner(AH, NULL, te);
+ _becomeOwner(AH, te);
_selectOutputSchema(AH, te->namespace);
/* Drop it */
ahprintf(AH, "%s", te->dropStmt);
if (strcmp(te->desc, "DATABASE") == 0)
{
ahlog(AH, 1, "connecting to new database \"%s\" as user \"%s\"\n", te->tag, te->owner);
- _reconnectAsUser(AH, te->tag, te->owner);
+ _reconnectToDB(AH, te->tag, te->owner);
}
}
{
_disableTriggersIfNecessary(AH, te, ropt);
- /*
- * Reconnect if necessary (_disableTriggers may
- * have reconnected)
- */
- _reconnectAsOwner(AH, NULL, te);
+ /* Select owner and schema as necessary */
+ _becomeOwner(AH, te);
_selectOutputSchema(AH, te->namespace);
ahlog(AH, 1, "restoring data for table \"%s\"\n", te->tag);
}
}
te = te->next;
- }
+ } /* end loop over TOC entries */
/*
* Now use blobs_xref (if used) to fixup any refs for tables that we
static void
_disableTriggersIfNecessary(ArchiveHandle *AH, TocEntry *te, RestoreOptions *ropt)
{
- char *oldUser;
- char *oldSchema;
-
/* This hack is only needed in a data-only restore */
if (!ropt->dataOnly || !ropt->disable_triggers)
return;
if (te && strcmp(te->desc, "BLOBS") == 0)
return;
- oldUser = strdup(AH->currUser);
- oldSchema = strdup(AH->currSchema);
-
/*
* Become superuser if possible, since they are the only ones who can
- * update pg_class. If -S was not given, but we are allowed to use
- * SET SESSION AUTHORIZATION, assume the initial user identity is a
- * superuser. Otherwise we just have to bull ahead anyway.
+ * update pg_class. If -S was not given, assume the initial user identity
+ * is a superuser.
*/
- if (ropt->superuser)
- {
- _reconnectAsUser(AH, NULL, ropt->superuser);
- /* be careful to preserve schema setting */
- _selectOutputSchema(AH, oldSchema);
- }
- else if (AH->ropt->use_setsessauth)
- _doSetSessionAuth(AH, NULL);
+ _becomeUser(AH, ropt->superuser);
ahlog(AH, 1, "disabling triggers\n");
else
ahprintf(AH, "UPDATE pg_catalog.pg_class SET reltriggers = 0 FROM pg_catalog.pg_namespace "
"WHERE relnamespace = pg_namespace.oid AND nspname !~ '^pg_';\n\n");
-
- /*
- * Restore original user and schema state.
- */
- if (ropt->superuser)
- {
- _reconnectAsUser(AH, NULL, oldUser);
- /* be careful to preserve schema setting */
- _selectOutputSchema(AH, oldSchema);
- }
- else if (AH->ropt->use_setsessauth)
- _doSetSessionAuth(AH, oldUser);
- free(oldUser);
- free(oldSchema);
}
static void
_enableTriggersIfNecessary(ArchiveHandle *AH, TocEntry *te, RestoreOptions *ropt)
{
- char *oldUser;
- char *oldSchema;
-
/* This hack is only needed in a data-only restore */
if (!ropt->dataOnly || !ropt->disable_triggers)
return;
if (te && strcmp(te->desc, "BLOBS") == 0)
return;
- oldUser = strdup(AH->currUser);
- oldSchema = strdup(AH->currSchema);
-
/*
* Become superuser if possible, since they are the only ones who can
- * update pg_class. If -S was not given, but we are allowed to use
- * SET SESSION AUTHORIZATION, assume the initial user identity is a
- * superuser. Otherwise we just have to bull ahead anyway.
+ * update pg_class. If -S was not given, assume the initial user identity
+ * is a superuser.
*/
- if (ropt->superuser)
- {
- _reconnectAsUser(AH, NULL, ropt->superuser);
- /* be careful to preserve schema setting */
- _selectOutputSchema(AH, oldSchema);
- }
- else if (AH->ropt->use_setsessauth)
- _doSetSessionAuth(AH, NULL);
+ _becomeUser(AH, ropt->superuser);
ahlog(AH, 1, "enabling triggers\n");
"(SELECT pg_catalog.count(*) FROM pg_catalog.pg_trigger where pg_class.oid = tgrelid) "
"FROM pg_catalog.pg_namespace "
"WHERE relnamespace = pg_namespace.oid AND nspname !~ '^pg_';\n\n");
-
- /*
- * Restore original user and schema state.
- */
- if (ropt->superuser)
- {
- _reconnectAsUser(AH, NULL, oldUser);
- /* be careful to preserve schema setting */
- _selectOutputSchema(AH, oldSchema);
- }
- else if (AH->ropt->use_setsessauth)
- _doSetSessionAuth(AH, oldUser);
- free(oldUser);
- free(oldSchema);
}
/*
/*
* Issue a SET SESSION AUTHORIZATION command. Caller is responsible
- * for updating state if appropriate. If user is NULL, the
- * specification DEFAULT will be used.
+ * for updating state if appropriate. If user is NULL or an empty string,
+ * the specification DEFAULT will be used.
*/
static void
_doSetSessionAuth(ArchiveHandle *AH, const char *user)
PQExpBuffer cmd = createPQExpBuffer();
appendPQExpBuffer(cmd, "SET SESSION AUTHORIZATION ");
- if (user)
- /*
- * SQL requires a string literal here. Might as well be correct.
- */
+ /*
+ * SQL requires a string literal here. Might as well be correct.
+ */
+ if (user && *user)
appendStringLiteral(cmd, user, false);
else
appendPQExpBuffer(cmd, "DEFAULT");
/*
- * Issue the commands to connect to the database as the specified user
- * to the specified database. The database name may be NULL, then the
- * current database is kept. If reconnects were disallowed by the
- * user, this won't do anything.
+ * Issue the commands to connect to the specified database
+ * as the specified user.
*
* If we're currently restoring right into a database, this will
* actually establish a connection. Otherwise it puts a \connect into
* the script output.
*/
static void
-_reconnectAsUser(ArchiveHandle *AH, const char *dbname, const char *user)
+_reconnectToDB(ArchiveHandle *AH, const char *dbname, const char *user)
{
- if (!user || strlen(user) == 0
- || (strcmp(AH->currUser, user) == 0 && !dbname))
- return; /* no need to do anything */
-
- /*
- * Use SET SESSION AUTHORIZATION if allowed and no database change
- * needed
- */
- if (!dbname && AH->ropt->use_setsessauth)
- _doSetSessionAuth(AH, user);
- else if (AH->ropt && AH->ropt->noReconnect)
- {
- /* When -R was given, don't do anything. */
- return;
- }
- else if (RestoringToDB(AH))
+ if (RestoringToDB(AH))
ReconnectToServer(AH, dbname, user);
else
{
ahprintf(AH, qry->data);
destroyPQExpBuffer(qry);
-
- /* don't assume we still know the output schema */
- if (AH->currSchema)
- free(AH->currSchema);
- AH->currSchema = strdup("");
}
/*
free(AH->currUser);
AH->currUser = strdup(user);
+
+ /* don't assume we still know the output schema */
+ if (AH->currSchema)
+ free(AH->currSchema);
+ AH->currSchema = strdup("");
}
+/*
+ * Become the specified user, and update state to avoid redundant commands
+ *
+ * NULL or empty argument is taken to mean restoring the session default
+ */
+static void
+_becomeUser(ArchiveHandle *AH, const char *user)
+{
+ if (!user)
+ user = ""; /* avoid null pointers */
+
+ if (AH->currUser && strcmp(AH->currUser, user) == 0)
+ return; /* no need to do anything */
+
+ _doSetSessionAuth(AH, user);
+
+ /*
+ * NOTE: currUser keeps track of what the imaginary session user in
+ * our script is
+ */
+ if (AH->currUser)
+ free(AH->currUser);
+
+ AH->currUser = strdup(user);
+}
/*
- * Issues the commands to connect to the database (or the current one,
- * if NULL) as the owner of the the given TOC entry object. If
+ * Become the owner of the the given TOC entry object. If
* changes in ownership are not allowed, this doesn't do anything.
*/
static void
-_reconnectAsOwner(ArchiveHandle *AH, const char *dbname, TocEntry *te)
+_becomeOwner(ArchiveHandle *AH, TocEntry *te)
{
if (AH->ropt && AH->ropt->noOwner)
return;
- _reconnectAsUser(AH, dbname, te->owner);
+ _becomeUser(AH, te->owner);
}
char *pfx;
/* Select owner and schema as necessary */
- _reconnectAsOwner(AH, NULL, te);
+ _becomeOwner(AH, te);
_selectOutputSchema(AH, te->namespace);
if (isData)
* by PostgreSQL
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.348 2003/09/22 00:23:34 petere Exp $
+ * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.349 2003/09/23 22:48:53 tgl Exp $
*
*-------------------------------------------------------------------------
*/
int outputCreate = 0;
int outputBlobs = 0;
int outputNoOwner = 0;
- int outputNoReconnect = 0;
static int use_setsessauth = 0;
static int disable_triggers = 0;
char *outputSuperuser = NULL;
pgport = optarg;
break;
- case 'R': /* No reconnect */
- outputNoReconnect = 1;
+ case 'R':
+ /* no-op, still accepted for backwards compatibility */
break;
case 's': /* dump schema only */
*/
case 'X':
if (strcmp(optarg, "use-set-session-authorization") == 0)
- use_setsessauth = 1;
+ /* no-op, still allowed for compatibility */ ;
else if (strcmp(optarg, "disable-triggers") == 0)
disable_triggers = 1;
else
ropt->superuser = outputSuperuser;
ropt->create = outputCreate;
ropt->noOwner = outputNoOwner;
- ropt->noReconnect = outputNoReconnect;
- ropt->use_setsessauth = use_setsessauth;
ropt->disable_triggers = disable_triggers;
if (compressLevel == -1)
printf(_(" -D, --column-inserts dump data as INSERT commands with column names\n"));
printf(_(" -n, --schema=SCHEMA dump the named schema only\n"));
printf(_(" -o, --oids include OIDs in dump\n"));
- printf(_(" -O, --no-owner do not output \\connect commands in plain\n"
- " text format\n"));
- printf(_(" -R, --no-reconnect disable ALL reconnections to the database in\n"
- " plain text format\n"));
+ printf(_(" -O, --no-owner do not output commands to set object ownership\n"
+ " in plain text format\n"));
printf(_(" -s, --schema-only dump only the schema, no data\n"));
printf(_(" -S, --superuser=NAME specify the superuser user name to use in\n"
" plain text format\n"));
printf(_(" -t, --table=TABLE dump the named table only\n"));
printf(_(" -x, --no-privileges do not dump privileges (grant/revoke)\n"));
- printf(_(" -X use-set-session-authorization, --use-set-session-authorization\n"
- " output SET SESSION AUTHORIZATION commands rather\n"
- " than \\connect commands\n"));
printf(_(" -X disable-triggers, --disable-triggers\n"
" disable triggers during data-only restore\n"));
* Portions Copyright (c) 1994, Regents of the University of California
*
*
- * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dumpall.c,v 1.27 2003/08/07 21:11:58 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dumpall.c,v 1.28 2003/09/23 22:48:53 tgl Exp $
*
*-------------------------------------------------------------------------
*/
const char *p;
int ret;
- appendPQExpBuffer(cmd, "%s %s -X use-set-session-authorization -Fp '",
- pgdumploc, pgdumpopts->data);
+ appendPQExpBuffer(cmd, "%s %s -Fp '", pgdumploc, pgdumpopts->data);
/* Shell quoting is not quite like SQL quoting, so can't use fmtId */
for (p = dbname; *p; p++)
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_restore.c,v 1.51 2003/08/28 20:21:34 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_restore.c,v 1.52 2003/09/23 22:48:53 tgl Exp $
*
*-------------------------------------------------------------------------
*/
opts->rearrange = 1;
break;
case 'R':
- opts->noReconnect = 1;
+ /* no-op, still accepted for backwards compatibility */
break;
case 'P': /* Function */
opts->selTypes = 1;
case 'X':
if (strcmp(optarg, "use-set-session-authorization") == 0)
- use_setsessauth = 1;
+ /* no-op, still allowed for compatibility */ ;
else if (strcmp(optarg, "disable-triggers") == 0)
disable_triggers = 1;
else
else
fileSpec = NULL;
- opts->use_setsessauth = use_setsessauth;
opts->disable_triggers = disable_triggers;
if (opts->formatName)
" output from this file\n"));
printf(_(" -N, --orig-order restore in original dump order\n"));
printf(_(" -o, --oid-order restore in OID order\n"));
- printf(_(" -O, --no-owner do not reconnect to database to match\n"
- " object owner\n"));
+ printf(_(" -O, --no-owner do not output commands to set object ownership\n"));
printf(_(" -P, --function=NAME(args)\n"
" restore named function\n"));
printf(_(" -r, --rearrange rearrange output to put indexes etc. at end\n"));
- printf(_(" -R, --no-reconnect disallow ALL reconnections to the database\n"));
printf(_(" -s, --schema-only restore only the schema, no data\n"));
printf(_(" -S, --superuser=NAME specify the superuser user name to use for\n"
" disabling triggers\n"));
printf(_(" -t, --table=NAME restore named table\n"));
printf(_(" -T, --trigger=NAME restore named trigger\n"));
printf(_(" -x, --no-privileges skip restoration of access privileges (grant/revoke)\n"));
- printf(_(" -X use-set-session-authorization, --use-set-session-authorization\n"
- " use SET SESSION AUTHORIZATION commands instead\n"
- " of reconnecting, if possible\n"));
printf(_(" -X disable-triggers, --disable-triggers\n"
" disable triggers during data-only restore\n"));