在使用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年前,建议删除然后重新添加约束。或将pg_class重新触发的值更改为0,这对于约束也可能是可行的...但是,恐怕它比好的实践更容易被黑客入侵...

您有什么建议,这种情况下的最佳做法是什么?是否pg_dump.exe 与该-clean标志一起使用会创建一个转储,从而在还原数据库时绕过约束检查?


这里交叉贴,万一有人认为这后面:stackoverflow.com/questions/12093654/...
克雷格林格

Answers:


28

您是否尝试过--disable-triggers选择pg_restore

根据文档:如果在数据重新加载期间不想调用表上的参照完整性检查或其他触发器,请使用此选项。

请注意,这仅对--data-only还原有效,并且还需要--superuser=username传递该选项。


它的工作原理就像一种魅力……
Stephane Rolland
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.