отключите ограничения перед использованием pg_restore.exe

16

Когда я пытаюсь выполнить pg_restore.exeфайл дампа из базы данных, он выдает десятки ошибок, все же:

ERROR: insert or update on table "someTable" violates foreign key constraint "aConstraintName"

Это, очевидно, связано с тем, что я очистил базу данных перед ее восстановлением из файла дампа (этот файл взят из рабочей базы данных) ... тогда, конечно, никакое ограничение внешних ключей не может быть нормальным, если одна ссылочная таблица пуста ...

Есть ли способ отключить ограничения и все внешние ключи, для всех таблиц, перед тем, как я позвоню pg_restore.exe, и после этого повторно включить ограничения и внешние ключи.

В SO я нашел кое-что интересное: отложить проверку ограничений, чтобы зафиксировать время . Но я не думаю, что смогу позвонить pg_restore.exeизнутри psql.exeпосле отсрочки ограничений.

Существует также этот пост , датированный 10 лет назад, предлагающий отбросить, а затем снова добавить ограничения. Или изменить значение pt_glass reltriggers на 0, что также было бы возможно для ограничений ... но я боюсь, что это больше взлом, чем хорошая практика ...

Что вы посоветуете, какова лучшая практика в этом случае? Использование pg_dump.exe с -cleanфлагом создает дамп, который обходит проверку ограничений при восстановлении базы данных?

Стефан Роллан
источник
Перекрестная публикация здесь, на случай, если кто-нибудь найдет это позже: stackoverflow.com/questions/12093654/…
Крейг Рингер

Ответы:

28

Вы пробовали --disable-triggersвариант pg_restore?

Согласно документации: используйте это, если у вас есть проверки ссылочной целостности или другие триггеры в таблицах, которые вы не хотите вызывать во время перезагрузки данных.

Обратите внимание, что это действительно только для --data-onlyвосстановления и требует, чтобы --superuser=usernameопция также была пропущена.

Мэтью Вуд
источник
И это работает как очарование ...
Стефан Роллан