@@ -252,6 +252,9 @@ void RestoreArchive(Archive* AHX, RestoreOptions *ropt)
252
252
*/
253
253
if (_canRestoreBlobs (AH )&& AH -> createdBlobXref )
254
254
{
255
+ /* NULL parameter means disable ALL user triggers */
256
+ _disableTriggers (AH ,NULL ,ropt );
257
+
255
258
te = AH -> toc -> next ;
256
259
while (te != AH -> toc ) {
257
260
@@ -275,6 +278,9 @@ void RestoreArchive(Archive* AHX, RestoreOptions *ropt)
275
278
276
279
te = te -> next ;
277
280
}
281
+
282
+ /* NULL parameter means enable ALL user triggers */
283
+ _enableTriggers (AH ,NULL ,ropt );
278
284
}
279
285
280
286
/*
@@ -335,13 +341,16 @@ static void _disableTriggers(ArchiveHandle *AH, TocEntry *te, RestoreOptions *ro
335
341
*/
336
342
if (ropt -> superuser )
337
343
{
338
- /* If we're not allowing changes for ownership, then remember the user
339
- * so we can change it back here. Otherwise, let _reconnectAsOwner
340
- * do what it has to do.
341
- */
342
- if (ropt -> noOwner )
343
- oldUser = strdup (ConnectedUser (AH ));
344
- _reconnectAsUser (AH ,"-" ,ropt -> superuser );
344
+ if (!_restoringToDB (AH )|| !ConnectedUserIsSuperuser (AH ))
345
+ {
346
+ /* If we're not allowing changes for ownership, then remember the user
347
+ * so we can change it back here. Otherwise, let _reconnectAsOwner
348
+ * do what it has to do.
349
+ */
350
+ if (ropt -> noOwner )
351
+ oldUser = strdup (ConnectedUser (AH ));
352
+ _reconnectAsUser (AH ,"-" ,ropt -> superuser );
353
+ }
345
354
}
346
355
347
356
ahlog (AH ,1 ,"Disabling triggers\n" );
@@ -351,7 +360,16 @@ static void _disableTriggers(ArchiveHandle *AH, TocEntry *te, RestoreOptions *ro
351
360
* command when one is available.
352
361
*/
353
362
ahprintf (AH ,"-- Disable triggers\n" );
354
- ahprintf (AH ,"UPDATE \"pg_class\" SET \"reltriggers\" = 0 WHERE \"relname\" !~ '^pg_';\n\n" );
363
+
364
+ /*
365
+ * Just update the AFFECTED table, if known.
366
+ */
367
+
368
+ if (te && te -> name && strlen (te -> name )> 0 )
369
+ ahprintf (AH ,"UPDATE \"pg_class\" SET \"reltriggers\" = 0 WHERE \"relname\" ~* '%s';\n" ,
370
+ te -> name );
371
+ else
372
+ ahprintf (AH ,"UPDATE \"pg_class\" SET \"reltriggers\" = 0 WHERE \"relname\" !~ '^pg_';\n\n" );
355
373
356
374
/*
357
375
* Restore the user connection from the start of this procedure
@@ -378,14 +396,17 @@ static void _enableTriggers(ArchiveHandle *AH, TocEntry *te, RestoreOptions *rop
378
396
*/
379
397
if (ropt -> superuser )
380
398
{
381
- /* If we're not allowing changes for ownership, then remember the user
382
- * so we can change it back here. Otherwise, let _reconnectAsOwner
383
- * do what it has to do
384
- */
385
- if (ropt -> noOwner )
386
- oldUser = strdup (ConnectedUser (AH ));
399
+ if (!_restoringToDB (AH )|| !ConnectedUserIsSuperuser (AH ))
400
+ {
401
+ /* If we're not allowing changes for ownership, then remember the user
402
+ * so we can change it back here. Otherwise, let _reconnectAsOwner
403
+ * do what it has to do
404
+ */
405
+ if (ropt -> noOwner )
406
+ oldUser = strdup (ConnectedUser (AH ));
387
407
388
- _reconnectAsUser (AH ,"-" ,ropt -> superuser );
408
+ _reconnectAsUser (AH ,"-" ,ropt -> superuser );
409
+ }
389
410
}
390
411
391
412
ahlog (AH ,1 ,"Enabling triggers\n" );
@@ -397,9 +418,19 @@ static void _enableTriggers(ArchiveHandle *AH, TocEntry *te, RestoreOptions *rop
397
418
ahprintf (AH ,"-- Enable triggers\n" );
398
419
ahprintf (AH ,"BEGIN TRANSACTION;\n" );
399
420
ahprintf (AH ,"CREATE TEMP TABLE \"tr\" (\"tmp_relname\" name, \"tmp_reltriggers\" smallint);\n" );
400
- ahprintf (AH ,"INSERT INTO \"tr\" SELECT C.\"relname\", count(T.\"oid\") FROM \"pg_class\" C,"
401
- " \"pg_trigger\" T WHERE C.\"oid\" = T.\"tgrelid\" AND C.\"relname\" !~ '^pg_' "
402
- " GROUP BY 1;\n" );
421
+
422
+ /*
423
+ * Just update the affected table, if known.
424
+ */
425
+ if (te && te -> name && strlen (te -> name )> 0 )
426
+ ahprintf (AH ,"INSERT INTO \"tr\" SELECT C.\"relname\", count(T.\"oid\") FROM \"pg_class\" C,"
427
+ " \"pg_trigger\" T WHERE C.\"oid\" = T.\"tgrelid\" AND C.\"relname\" ~* '%s' "
428
+ " GROUP BY 1;\n" ,te -> name );
429
+ else
430
+ ahprintf (AH ,"INSERT INTO \"tr\" SELECT C.\"relname\", count(T.\"oid\") FROM \"pg_class\" C,"
431
+ " \"pg_trigger\" T WHERE C.\"oid\" = T.\"tgrelid\" AND C.\"relname\" !~ '^pg_' "
432
+ " GROUP BY 1;\n" );
433
+
403
434
ahprintf (AH ,"UPDATE \"pg_class\" SET \"reltriggers\" = TMP.\"tmp_reltriggers\" "
404
435
"FROM \"tr\" TMP WHERE "
405
436
"\"pg_class\".\"relname\" = TMP.\"tmp_relname\";\n" );
@@ -580,7 +611,7 @@ void StartRestoreBlob(ArchiveHandle* AH, int oid)
580
611
if (loOid == 0 )
581
612
die_horribly (AH ,"%s: unable to create BLOB\n" ,progname );
582
613
583
- ahlog (AH ,1 ,"Restoring BLOB oid %d as %d\n" ,oid ,loOid );
614
+ ahlog (AH ,2 ,"Restoring BLOB oid %d as %d\n" ,oid ,loOid );
584
615
585
616
InsertBlobXref (AH ,oid ,loOid );
586
617