Я получил дамп моей базы данных PostgreSQL с:
pg_dump -U user-name -d db-name -f dumpfile
который я затем продолжаю восстанавливать в другой базе данных:
psql X -U postgres -d db-name-b -f dumpfile
Моя проблема заключается в том, что база данных содержит ссылочные ограничения, проверки и триггеры, и некоторые из них (проверки могут показаться особенно) дают сбой во время восстановления, так как информация не загружается в том порядке, в котором эти проверки будут выполнены. Например, вставка строки в таблицу может быть связана с функцией, CHECK
вызывающей plpgsql
функцию, которая проверяет, выполняется ли условие в какой-либо другой несвязанной таблице. Если эта последняя таблица не загружена psql
до первой, возникает ошибка.
Ниже приведен SSCCE, который создает такую базу данных, которая после сброса pg_dump
не может быть восстановлена:
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());
Есть ли способ отключить (из командной строки) все такие ограничения во время восстановления дампа и включить их снова после этого? Я использую PostgreSQL 9.1.
CHECK
ограничении, то все гарантии аннулируются, потому что это официально не поддерживается, просто допускается. Но объявление CHECK
ограничения NOT VALID
заставило меня работать во всех отношениях. Могут быть угловые случаи, которых я никогда не трогал ...
-X
и-d
вариантов дляpg_dump
.pg_dump
создает дамп, который можно восстановить в пустой БД.