J'ai obtenu un vidage de ma base de données PostgreSQL avec:
pg_dump -U user-name -d db-name -f dumpfile
que je procède ensuite à restaurer dans une autre base de données avec:
psql X -U postgres -d db-name-b -f dumpfile
Mon problème est que la base de données contient des contraintes référentielles, des vérifications et des déclencheurs et certains de ces contrôles (il semblerait en particulier) échouent pendant la restauration car les informations ne sont pas chargées dans l'ordre qui entraînerait le respect de ces vérifications. Par exemple, l' insertion d' une ligne dans une table peut être associée à un CHECK
qui appelle une plpgsql
fonction qui vérifie si une condition est dans une autre table sans rapport. Si cette dernière table n'est pas chargée par psql
avant la première, une erreur se produit.
Ce qui suit est un SSCCE qui produit une telle base de données qui, une fois sauvegardée avec, pg_dump
ne peut pas être restaurée:
CREATE OR REPLACE FUNCTION fail_if_b_empty () RETURNS BOOLEAN AS $$
SELECT EXISTS (SELECT 1 FROM b)
$$ LANGUAGE SQL;
CREATE TABLE IF NOT EXISTS a (
i INTEGER NOT NULL
);
INSERT INTO a(i) VALUES (0),(1);
CREATE TABLE IF NOT EXISTS b (
i INTEGER NOT NULL
);
INSERT INTO b(i) VALUES (0);
ALTER TABLE a ADD CONSTRAINT a_constr_1 CHECK (fail_if_b_empty());
Existe-t-il un moyen de désactiver (à partir de la ligne de commande) toutes ces contraintes pendant la restauration du vidage et de les réactiver par la suite? J'utilise PostgreSQL 9.1.
CHECK
contrainte, alors toutes les garanties sont annulées, car ce n'est pas officiellement pris en charge, juste toléré. Mais déclarer la CHECK
contrainte l'a NOT VALID
fait fonctionner à tous égards pour moi. Il y a peut-être des cas d'angle que je n'ai jamais touchés ...
-X
et d'-d
options pourpg_dump
.pg_dump
produit un vidage qui peut être restauré dans une base de données vide.