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