disabilitare i vincoli prima di utilizzare pg_restore.exe


16

Quando provo a eseguire pg_restore.exeun file di dump da un database, genera dozzine di errori, lo stesso:

ERROR: insert or update on table "someTable" violates foreign key constraint "aConstraintName"

Ciò è ovviamente dovuto al fatto che ho svuotato il database prima di ripristinarlo dal file di dump (questo file proviene da un database di produzione) ... quindi ovviamente nessun vincolo di chiavi esterne può essere ok se una tabella di riferimento è vuota ...

Esiste un modo per disabilitare i vincoli e tutte le chiavi esterne, per tutte le tabelle, prima che io chiami pg_restore.exee, successivamente, riattivare i vincoli e le chiavi esterne.

In SO ho trovato qualcosa di interessante: rinviare il controllo dei vincoli per impegnare il tempo . Ma non credo di poter chiamare pg_restore.exedall'interno psql.exedopo aver rinviato i vincoli.

C'è anche questo post , risalente a 10 anni fa, che suggerisce di abbandonare e aggiungere nuovamente i vincoli. O per cambiare il valore di pg_class reltriggers su 0 e questo sarebbe anche possibile per i vincoli ... ma temo che sia più un hacking che una buona pratica ...

Cosa consigli, qual è la migliore pratica in questo caso? L'uso pg_dump.exe con il -cleanflag crea un dump che ignora il controllo dei vincoli durante il ripristino del database?


Pubblicazione incrociata qui, nel caso in cui qualcuno lo trovi in ​​seguito: stackoverflow.com/questions/12093654/…
Craig Ringer

Risposte:


28

Hai provato a --disable-triggersfarlo pg_restore?

Secondo la documentazione: utilizzare questa opzione se nelle tabelle sono presenti controlli di integrità referenziale o altri trigger che non si desidera richiamare durante il ricaricamento dei dati.

Si noti che questo è valido solo per un --data-onlyripristino e richiede anche l' --superuser=usernameopzione da passare.


E funziona come un fascino ...
Stephane Rolland,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.