Ho ottenuto un dump del mio database PostgreSQL con:
pg_dump -U user-name -d db-name -f dumpfile
che quindi procedo al ripristino in un altro database con:
psql X -U postgres -d db-name-b -f dumpfile
Il mio problema è che il database contiene vincoli, controlli e trigger referenziali e alcuni di questi (controlli sembrerebbero in particolare) falliscono durante il ripristino poiché le informazioni non vengono caricate nell'ordine che renderebbe tali controlli onorati. Ad esempio, l'inserimento di una riga in una tabella può essere associato a una CHECK
che chiama una plpgsql
funzione che controlla se una condizione è presente in un'altra tabella non correlata. Se quest'ultima tabella non viene caricata psql
prima della prima, si verifica un errore.
Di seguito è riportato un SSCCE che produce un tale database che una volta scaricato con pg_dump
non può essere ripristinato:
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());
C'è un modo per disabilitare (dalla riga di comando) tutti questi vincoli durante il ripristino del dump e riattivarli in seguito? Sto eseguendo PostgreSQL 9.1.
CHECK
vincolo, allora tutte le garanzie vengono annullate, perché non ufficialmente supportate, solo tollerate. Ma dichiarare il CHECK
vincolo NOT VALID
lo ha fatto funzionare per me sotto ogni aspetto. Potrebbero esserci casi angolari che non ho mai toccato ...
-X
e-d
opzioni perpg_dump
.pg_dump
produce una discarica che è ripristinabile in un DB vuoto.