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 CHECKqui appelle une plpgsqlfonction qui vérifie si une condition est dans une autre table sans rapport. Si cette dernière table n'est pas chargée par psqlavant 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_dumpne 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.
CHECKcontrainte, alors toutes les garanties sont annulées, car ce n'est pas officiellement pris en charge, juste toléré. Mais déclarer la CHECKcontrainte l'a NOT VALIDfait fonctionner à tous égards pour moi. Il y a peut-être des cas d'angle que je n'ai jamais touchés ...
-Xet d'-doptions pourpg_dump.pg_dumpproduit un vidage qui peut être restauré dans une base de données vide.