2

为了从转储中恢复数据库,我想暂时禁用我已清空的数据库所有表中的所有约束(postregsql 8.3)。

是否有一种安全的方法来修改 pg_constraint 表中的字段,可以轻松绕过约束?

当我查看文档pg_constraint时,我不这么认为。

是否可以删除 pg_constraint 表内容,然后重新填充?

如果没有,人们如何使用充满约束和外键的表来恢复/复制数据库?(我的目标数据库具有架构,但所有列都是空的)。

编辑:虽然 Erwin Brandstetter 的回答是对我的精确问题的好回答(带有明智的警告)......我在恢复期间避免外键错误的一般问题的解决方案是在使用 pg_restore 时使用标志 --disable-triggers。

最后,我的两行命令现在是:

pg_dump.exe  -h %ipAddress% -p 5432 -U postgres -F c -a -v -f %file% mydb
pg_restore.exe -h localhost -p 5432 -U postgres -d mydb -v %file%  --disable-triggers

它工作正常。

4

2 回答 2

5

你可以 ...

ALTER TABLE tbl DISABLE TRIGGER ALL;

这将永久禁用表的所有触发器。所以不要忘记稍后运行:

ALTER TABLE tbl ENABLE TRIGGER ALL;

-> 8.3 手册

你可以 ...

SET CONSTRAINTS ALL DEFERRED;

这使得所有可延迟的约束等到事务结束。
-> 8.3 手册

除非您是黑客并且确切地知道自己在做什么,否则您永远不应该手动修改系统目录中的表。凡人应该专门使用DDL命令来影响系统目录。

于 2012-08-23T14:30:56.070 回答
3

如果您的约束是DEFERRABLE,那么您可以这样做:

SET CONSTRAINTS DEFERRED

然而,这只是将约束检查转移到下一个COMMIT- 换句话说,它是每个事务。

通常对于移动数据,部署某种备份策略。

于 2012-08-23T14:28:52.950 回答