Add pg_dump -X no-data-for-failed-tables option to suppress loading data

if table creation failed (the table already exists).

Martin Pitt
This commit is contained in:
Bruce Momjian 2006-08-01 18:21:44 +00:00
parent 6d0f5ea574
commit c61607bd52
4 changed files with 55 additions and 18 deletions

View File

@ -1,4 +1,4 @@
<!-- $PostgreSQL: pgsql/doc/src/sgml/ref/pg_restore.sgml,v 1.59 2006/03/17 16:02:47 petere Exp $ -->
<!-- $PostgreSQL: pgsql/doc/src/sgml/ref/pg_restore.sgml,v 1.60 2006/08/01 18:21:44 momjian Exp $ -->
<refentry id="APP-PGRESTORE">
<refmeta>
@ -360,20 +360,6 @@
</listitem>
</varlistentry>
<varlistentry>
<term><option>-X use-set-session-authorization</option></term>
<term><option>--use-set-session-authorization</option></term>
<listitem>
<para>
Output SQL-standard <command>SET SESSION AUTHORIZATION</> commands
instead of <command>ALTER OWNER</> commands to determine object
ownership. This makes the dump more standards compatible, but
depending on the history of the objects in the dump, may not restore
properly.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>-X disable-triggers</></term>
<term><option>--disable-triggers</></term>
@ -397,6 +383,34 @@
</listitem>
</varlistentry>
<varlistentry>
<term><option>-X use-set-session-authorization</option></term>
<term><option>--use-set-session-authorization</option></term>
<listitem>
<para>
Output SQL-standard <command>SET SESSION AUTHORIZATION</> commands
instead of <command>ALTER OWNER</> commands to determine object
ownership. This makes the dump more standards compatible, but
depending on the history of the objects in the dump, may not restore
properly.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>-X no-data-for-failed-tables</></term>
<listitem>
<para>
By default, table data objects are restored even if the
associated table could not be successfully created (e. g.
because it already exists). With this option, such table
data is silently ignored. This is useful for dumping and
restoring databases with tables which contain auxiliary data
for PostgreSQL extensions (e. g. PostGIS).
</para>
</listitem>
</varlistentry>
</variablelist>
</para>

View File

@ -15,7 +15,7 @@
*
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/bin/pg_dump/pg_backup.h,v 1.41 2006/07/14 14:52:26 momjian Exp $
* $PostgreSQL: pgsql/src/bin/pg_dump/pg_backup.h,v 1.42 2006/08/01 18:21:44 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@ -109,6 +109,7 @@ typedef struct _restoreOptions
char *pghost;
char *username;
int ignoreVersion;
int noDataForFailedTables;
int requirePassword;
int exit_on_error;

View File

@ -15,7 +15,7 @@
*
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/bin/pg_dump/pg_backup_archiver.c,v 1.134 2006/07/18 17:42:00 momjian Exp $
* $PostgreSQL: pgsql/src/bin/pg_dump/pg_backup_archiver.c,v 1.135 2006/08/01 18:21:44 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@ -278,6 +278,23 @@ RestoreArchive(Archive *AHX, RestoreOptions *ropt)
_printTocEntry(AH, te, ropt, false, false);
defnDumped = true;
/* If we could not create a table, ignore the respective TABLE DATA if
* -X no-data-for-failed-tables is given */
if (ropt->noDataForFailedTables && AH->lastErrorTE == te && strcmp (te->desc, "TABLE") == 0) {
TocEntry *tes, *last;
ahlog (AH, 1, "table %s could not be created, will not restore its data\n", te->tag);
for (last = te, tes = te->next; tes != AH->toc; last = tes, tes = tes->next) {
if (strcmp (tes->desc, "TABLE DATA") == 0 && strcmp (tes->tag, te->tag) == 0 &&
strcmp (tes->namespace ? tes->namespace : "", te->namespace ? te->namespace : "") == 0) {
/* remove this node */
last->next = tes->next;
break;
}
}
}
/* If we created a DB, connect to it... */
if (strcmp(te->desc, "DATABASE") == 0)
{

View File

@ -34,7 +34,7 @@
*
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/bin/pg_dump/pg_restore.c,v 1.79 2006/07/14 14:52:26 momjian Exp $
* $PostgreSQL: pgsql/src/bin/pg_dump/pg_restore.c,v 1.80 2006/08/01 18:21:44 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@ -252,6 +252,8 @@ main(int argc, char **argv)
use_setsessauth = 1;
else if (strcmp(optarg, "disable-triggers") == 0)
disable_triggers = 1;
else if (strcmp(optarg, "no-data-for-failed-tables") == 0)
opts->noDataForFailedTables = 1;
else
{
fprintf(stderr,
@ -397,6 +399,9 @@ usage(const char *progname)
printf(_(" -X use-set-session-authorization, --use-set-session-authorization\n"
" use SESSION AUTHORIZATION commands instead of\n"
" OWNER TO commands\n"));
printf(_(" -X no-data-for-failed-tables\n"
" do not restore data of tables which could not be\n"
" created\n"));
printf(_(" -1, --single-transaction restore as a single transaction\n"));
printf(_("\nConnection options:\n"));