Ich habe einen Speicherauszug meiner PostgreSQL-Datenbank erhalten mit:
pg_dump -U user-name -d db-name -f dumpfile
die ich dann in einer anderen datenbank wiederherstelle mit:
psql X -U postgres -d db-name-b -f dumpfile
Mein Problem ist, dass die Datenbank referenzielle Einschränkungen, Überprüfungen und Trigger enthält und einige dieser (Überprüfungen, die es besonders scheinen) während der Wiederherstellung fehlschlagen, da die Informationen nicht in der Reihenfolge geladen werden, in der diese Überprüfungen berücksichtigt würden. Zum Beispiel kann das Einfügen einer Zeile in eine Tabelle mit einer verknüpft sein CHECK
, die eine plpgsql
Funktion aufruft , die prüft, ob eine Bedingung in einer anderen nicht verwandten Tabelle vorliegt. Wenn diese letztere Tabelle nicht psql
vor der ersteren geladen wird , tritt ein Fehler auf.
Das Folgende ist eine SSCCE, die eine solche Datenbank erstellt, die nach dem Sichern pg_dump
nicht wiederhergestellt werden kann:
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());
Gibt es eine Möglichkeit, alle diese Einschränkungen während der Dump-Wiederherstellung (über die Befehlszeile) zu deaktivieren und anschließend wieder zu aktivieren? Ich verwende PostgreSQL 9.1.
CHECK
Einschränkung verweist , werden alle Garantien ungültig, da dies nicht offiziell unterstützt wird, sondern nur toleriert wird. Aber die CHECK
Einschränkung NOT VALID
zu erklären, hat in jeder Hinsicht für mich funktioniert. Es kann Eckfälle geben, die ich nie angerührt habe ...
-X
und-d
Optionen fürpg_dump
.pg_dump
erzeugt ein Dump , die ist in einer leeren DB restorable.