diff options
Diffstat (limited to 'src/bin/pg_dump/pg_backup_archiver.c')
-rw-r--r-- | src/bin/pg_dump/pg_backup_archiver.c | 69 |
1 files changed, 50 insertions, 19 deletions
diff --git a/src/bin/pg_dump/pg_backup_archiver.c b/src/bin/pg_dump/pg_backup_archiver.c index fb799db71b2..51f68f2bab0 100644 --- a/src/bin/pg_dump/pg_backup_archiver.c +++ b/src/bin/pg_dump/pg_backup_archiver.c @@ -252,6 +252,9 @@ void RestoreArchive(Archive* AHX, RestoreOptions *ropt) */ if (_canRestoreBlobs(AH) && AH->createdBlobXref) { + /* NULL parameter means disable ALL user triggers */ + _disableTriggers(AH, NULL, ropt); + te = AH->toc->next; while (te != AH->toc) { @@ -275,6 +278,9 @@ void RestoreArchive(Archive* AHX, RestoreOptions *ropt) te = te->next; } + + /* NULL parameter means enable ALL user triggers */ + _enableTriggers(AH, NULL, ropt); } /* @@ -335,13 +341,16 @@ static void _disableTriggers(ArchiveHandle *AH, TocEntry *te, RestoreOptions *ro */ if (ropt->superuser) { - /* If we're not allowing changes for ownership, then remember the user - * so we can change it back here. Otherwise, let _reconnectAsOwner - * do what it has to do. - */ - if (ropt->noOwner) - oldUser = strdup(ConnectedUser(AH)); - _reconnectAsUser(AH, "-", ropt->superuser); + if (!_restoringToDB(AH) || !ConnectedUserIsSuperuser(AH)) + { + /* If we're not allowing changes for ownership, then remember the user + * so we can change it back here. Otherwise, let _reconnectAsOwner + * do what it has to do. + */ + if (ropt->noOwner) + oldUser = strdup(ConnectedUser(AH)); + _reconnectAsUser(AH, "-", ropt->superuser); + } } ahlog(AH, 1, "Disabling triggers\n"); @@ -351,7 +360,16 @@ static void _disableTriggers(ArchiveHandle *AH, TocEntry *te, RestoreOptions *ro * command when one is available. */ ahprintf(AH, "-- Disable triggers\n"); - ahprintf(AH, "UPDATE \"pg_class\" SET \"reltriggers\" = 0 WHERE \"relname\" !~ '^pg_';\n\n"); + + /* + * Just update the AFFECTED table, if known. + */ + + if (te && te->name && strlen(te->name) > 0) + ahprintf(AH, "UPDATE \"pg_class\" SET \"reltriggers\" = 0 WHERE \"relname\" ~* '%s';\n", + te->name); + else + ahprintf(AH, "UPDATE \"pg_class\" SET \"reltriggers\" = 0 WHERE \"relname\" !~ '^pg_';\n\n"); /* * Restore the user connection from the start of this procedure @@ -378,14 +396,17 @@ static void _enableTriggers(ArchiveHandle *AH, TocEntry *te, RestoreOptions *rop */ if (ropt->superuser) { - /* If we're not allowing changes for ownership, then remember the user - * so we can change it back here. Otherwise, let _reconnectAsOwner - * do what it has to do - */ - if (ropt->noOwner) - oldUser = strdup(ConnectedUser(AH)); + if (!_restoringToDB(AH) || !ConnectedUserIsSuperuser(AH)) + { + /* If we're not allowing changes for ownership, then remember the user + * so we can change it back here. Otherwise, let _reconnectAsOwner + * do what it has to do + */ + if (ropt->noOwner) + oldUser = strdup(ConnectedUser(AH)); - _reconnectAsUser(AH, "-", ropt->superuser); + _reconnectAsUser(AH, "-", ropt->superuser); + } } ahlog(AH, 1, "Enabling triggers\n"); @@ -397,9 +418,19 @@ static void _enableTriggers(ArchiveHandle *AH, TocEntry *te, RestoreOptions *rop ahprintf(AH, "-- Enable triggers\n"); ahprintf(AH, "BEGIN TRANSACTION;\n"); ahprintf(AH, "CREATE TEMP TABLE \"tr\" (\"tmp_relname\" name, \"tmp_reltriggers\" smallint);\n"); - ahprintf(AH, "INSERT INTO \"tr\" SELECT C.\"relname\", count(T.\"oid\") FROM \"pg_class\" C," - " \"pg_trigger\" T WHERE C.\"oid\" = T.\"tgrelid\" AND C.\"relname\" !~ '^pg_' " - " GROUP BY 1;\n"); + + /* + * Just update the affected table, if known. + */ + if (te && te->name && strlen(te->name) > 0) + ahprintf(AH, "INSERT INTO \"tr\" SELECT C.\"relname\", count(T.\"oid\") FROM \"pg_class\" C," + " \"pg_trigger\" T WHERE C.\"oid\" = T.\"tgrelid\" AND C.\"relname\" ~* '%s' " + " GROUP BY 1;\n", te->name); + else + ahprintf(AH, "INSERT INTO \"tr\" SELECT C.\"relname\", count(T.\"oid\") FROM \"pg_class\" C," + " \"pg_trigger\" T WHERE C.\"oid\" = T.\"tgrelid\" AND C.\"relname\" !~ '^pg_' " + " GROUP BY 1;\n"); + ahprintf(AH, "UPDATE \"pg_class\" SET \"reltriggers\" = TMP.\"tmp_reltriggers\" " "FROM \"tr\" TMP WHERE " "\"pg_class\".\"relname\" = TMP.\"tmp_relname\";\n"); @@ -580,7 +611,7 @@ void StartRestoreBlob(ArchiveHandle* AH, int oid) if (loOid == 0) die_horribly(AH, "%s: unable to create BLOB\n", progname); - ahlog(AH, 1, "Restoring BLOB oid %d as %d\n", oid, loOid); + ahlog(AH, 2, "Restoring BLOB oid %d as %d\n", oid, loOid); InsertBlobXref(AH, oid, loOid); |