Я отримав дамп моєї бази даних 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створює дамп, який можна відновити в порожній БД.