отключите ограничения перед использованием 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опция также была пропущена.


И это работает как очарование ...
Стефан Роллан
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.