désactiver les contraintes avant d'utiliser pg_restore.exe

16

Lorsque j'essaie d'exécuter pg_restore.exeun fichier de vidage à partir d'une base de données, cela génère des dizaines d'erreurs, tout de même:

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

Cela est évidemment dû au fait que j'ai vidé la base de données avant de la restaurer à partir du fichier de vidage (ce fichier provient d'une base de données de production) ... alors bien sûr, aucune contrainte de clés étrangères ne peut être correcte si une table référencée est vide ...

Existe-t-il un moyen de désactiver les contraintes et toutes les clés étrangères, pour toutes les tables, avant d'appeler pg_restore.exe, puis de réactiver les contraintes et les clés étrangères.

Dans SO, j'ai trouvé quelque chose d'intéressant: reporter la vérification des contraintes pour valider le temps . Mais je ne pense pas pouvoir appeler pg_restore.exede l'intérieur psql.exeaprès avoir différé les contraintes.

Il y a aussi ce post , datant d'il y a 10 ans, suggérant de supprimer puis de rajouter les contraintes. Ou changer la valeur des religgers de pg_class à 0 et ce serait également possible pour les contraintes ... mais je crains que ce soit plus de piratage que de bonnes pratiques ...

Que conseillez-vous, quelle est la meilleure pratique dans ce cas? L'utilisation pg_dump.exe avec l' -cleanindicateur crée-t-elle un vidage qui contourne la vérification des contraintes lors de la restauration de la base de données?

Stéphane Rolland
la source
Posté ici, au cas où quelqu'un le trouverait plus tard: stackoverflow.com/questions/12093654/…
Craig Ringer

Réponses:

28

Avez-vous essayé le --disable-triggers option pg_restore?

Selon la documentation: utilisez ceci si vous avez des vérifications d'intégrité référentielle ou d'autres déclencheurs sur les tables que vous ne souhaitez pas appeler pendant le rechargement des données.

Veuillez noter que cela n'est valable que pour une --data-onlyrestauration et nécessite également le passage de l' --superuser=usernameoption.

Matthew Wood
la source
Et ça marche comme un charme ...
Stephane Rolland