Otrzymałem zrzut mojej bazy danych PostgreSQL z:
pg_dump -U user-name -d db-name -f dumpfile
którą następnie przywracam w innej bazie danych za pomocą:
psql X -U postgres -d db-name-b -f dumpfile
Mój problem polega na tym, że baza danych zawiera ograniczenia referencyjne, kontrole i wyzwalacze, a niektóre z nich (kontrole, jak by się to wydawało w szczególności) zawodzą podczas przywracania, ponieważ informacje nie są ładowane w kolejności, która spowodowałaby, że kontrole te zostałyby uznane. Na przykład wstawienie wiersza w tabeli może być powiązane z funkcją CHECK
wywołującą plpgsql
funkcję, która sprawdza, czy warunek zachowuje się w innej niepowiązanej tabeli. Jeśli ta ostatnia tabela nie zostanie załadowana psql
przed pierwszą, pojawi się błąd.
Poniżej przedstawiono kod SSCCE, który tworzy bazę danych, której pg_dump
nie można przywrócić po zrzuceniu :
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());
Czy istnieje sposób, aby wyłączyć (z wiersza poleceń) wszystkie takie ograniczenia podczas przywracania zrzutu i włączyć je ponownie później? Korzystam z PostgreSQL 9.1.
CHECK
ograniczeniu, wówczas wszystkie gwarancje zostaną unieważnione, ponieważ nie jest to oficjalnie obsługiwane, tylko tolerowane. Ale stwierdzenie CHECK
ograniczenia NOT VALID
sprawiło, że zadziałało to dla mnie pod każdym względem. Mogą istnieć przypadki narożne, których nigdy nie dotknąłem ...
-X
i-d
opcjipg_dump
.pg_dump
tworzy zrzut, który można odtworzyć w pustej bazie danych.