PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 09/05/2023 12:03:40

noob_postgres
Membre

Restauration table par table et contraintes externes

Bonjour,

Je souhaite restaurer des tables spécifiques sans toucher aux autres tables et ne pas faire une restauration complète.
Or, sur ces tables, il y a des contraintes externes (clés étrangères).

J'essaie de procéder ainsi :

BEGIN;
ALTER TABLE nom_table1 ALTER CONSTRAINT nom_contrainte1 DEFERRABLE;
SET CONSTRAINTS nom_contrainte1 DEFERRED;
ALTER TABLE nom_table2 ALTER CONSTRAINT nom_contrainte2 DEFERRABLE;
SET CONSTRAINTS nom_contrainte2 DEFERRED;
COMMIT;

puis j'efface le contenu de ma table à restaurer :
DELETE FROM ma_table_à_restaurer;

puis j'essaie de faire en user postgres : pg_restore -v -p 5440 -d ma_base -t ma_table_à_restaurer --data-only  mondump.dump

mais j'ai toujours des erreurs de ce type ERROR: duplicate key value violates unique constraint "pk_nom_contrainte"

Mais ce ne doit pas être la bonne façon de procéder ....je tourne en boucle sur le sujet.

Quelq'un aurait-il une méthode qui fonctionne ?

Merci pour votre aide,

Hors ligne

#2 09/05/2023 13:54:13

Raoka
Membre

Re : Restauration table par table et contraintes externes

Salut, j'ai déjà eu besoin de faire quelque chose comme ça, donc voilà ma méthode, j'espère que ça marchera pour vous

Restaurer des tables spécifiques sans toucher aux autres tables peut être délicat, surtout si vous avez des contraintes externes telles que des clés étrangères. Cependant, il existe une méthode pour y parvenir.

Tout d'abord, vous pouvez utiliser la commande pg_dump pour extraire uniquement les tables que vous souhaitez restaurer. Par exemple, vous pouvez utiliser la commande suivante pour extraire la table nommée ma_table_à_restaurer :

pg_dump -t ma_table_à_restaurer ma_base > ma_table_à_restaurer.dump

Ensuite, vous pouvez restaurer la table en utilisant la commande suivante :

pg_restore -v -p 5440 -d ma_base -t ma_table_à_restaurer ma_table_à_restaurer.dump

Notez que vous n'avez pas besoin de l'option --data-only car vous ne restaurez qu'une seule table.

Enfin, si vous rencontrez toujours des erreurs de violation de contrainte, vous pouvez essayer de désactiver temporairement la contrainte avec la commande ALTER TABLE et SET CONSTRAINTS. Cependant, assurez-vous de réactiver la contrainte une fois que vous avez restauré toutes les tables nécessaires.

J'espère que cela vous aidera à résoudre votre problème !

Hors ligne

#3 09/05/2023 17:06:39

noob_postgres
Membre

Re : Restauration table par table et contraintes externes

Salut et merci pour la réponse.

c'est que j'ai fait mais les contraintes ne passent pas en "deferred".

Hors ligne

#4 09/05/2023 21:40:04

gleu
Administrateur

Re : Restauration table par table et contraintes externes

Elles passent "deferred". Cependant, comme la documentation l'indique, elles passent uniquement pendant le temps de la transaction. Donc au COMMIT, pouf, le mode "DEFERRED" est annulé. À ma connaissance, pg_restore ne peut pas le faire. Il faut donc créer votre propre solution (une version personnalisée de pg_restore semblerait le plus simple).


Guillaume.

Hors ligne

#5 10/05/2023 11:29:12

noob_postgres
Membre

Re : Restauration table par table et contraintes externes

Bonjour,
Qu'entendez-vous par version personnalisés de pg_restore ?

Hors ligne

#6 10/05/2023 16:15:30

noob_postgres
Membre

Re : Restauration table par table et contraintes externes

en fait je viens de refaire un test où j'ai çà :

BEGIN;
ALTER TABLE nom_table1 ALTER CONSTRAINT nom_contrainte1 DEFERRABLE;
SET CONSTRAINTS nom_contrainte1 DEFERRED;
ALTER TABLE nom_table2 ALTER CONSTRAINT nom_contrainte2 DEFERRABLE;
SET CONSTRAINTS nom_contrainte2 DEFERRED;
DROP ma_table_à_restaurer ;

et là erreur "ERROR:  cannot drop table ma_table_à_restaurer because other objects depend on it" et me suggère de faire un DROP CASCADE ....ce qui ne m'arrange pas du tout

Ici l'idée était de faire un drop de ma table avant de lancer une restauration dans la transaction en cours en faisant \i ma_table_à_restaurer.sql  (que j'ai extrait de mon dump)

car si je lance la restauration sans dropper j'ai ce message d"erreur ERROR:  relation "ma_table_à_restaurer" already exists ....

Hors ligne

#7 10/05/2023 17:31:45

dverite
Membre

Re : Restauration table par table et contraintes externes

L'erreur du pg_restore citée au 1er message est une violation de clef primaire qui suggère le DELETE FROM ma_table_à_restaurer a été fait dans une transaction non committée.


Le pg_restore se faisant dans une autre transaction, de son point de vue les données de ma_table_à_restaurer sont toujours là.


Pour faire marcher votre idée, il faudrait tout faire dans la même transaction, donc au lieu de jouer pg_restore directement sur la base il faut lui demander de créer un fichier avec les commandes SQL de restauration (option -f- de pg_restore) et ensuite passer ces commandes dans la même transaction que le reste (\i sous psql) après le DELETE et avant le COMMIT.

Hors ligne

#8 10/05/2023 17:40:26

noob_postgres
Membre

Re : Restauration table par table et contraintes externes

c'est ce que j'essaie de faire justement dans le même transaction, je fais les set constraints puis j'essaie de deleter ma table avec drop table mais la commande ne passe pas ou bien vider son contenu avec truncate table (error:cannot truncate a table referenced in a foreign key constraint) ;

après mon begin, j'ai même essayé un ALTER TABLE ma_table_à_restaurer DISABLE TRIGGER ALL;
et là mon \i ma_table_à_restaurer me répond "ERROR:  duplicate key value violates unique constraint ...."
j'ai l'impression de tourner en rond ...

Hors ligne

#9 10/05/2023 18:03:23

dverite
Membre

Re : Restauration table par table et contraintes externes

Dans le 1er message il est question de faire DELETE, pas DROP ni TRUNCATE qui effectivement ne sont pas possibles en présence des contraintes d'intégrité référentielles.

Hors ligne

Pied de page des forums