是否应通过DISABLE TRIGGER ALL禁用外键约束检查?

时间:2018-08-09 21:04:36

标签: sql postgresql foreign-keys database-trigger

我正在将数据从一个PostgreSQL v10表复制到另一个。目标表具有几个外键约束。我很惊讶,即使外键约束所引用的表都没有任何数据,也没有出现任何错误。

在进行复制之前,我使用DISABLE TRIGGER ALL确保不会触发目标表上定义的触发器。我很惊讶复制成功。在ENABLE TRIGGER ALL之后,我尝试再添加一行,即现有行的副本。失败并违反了外键约束。然后,我做了DISABLE TRIGGER ALL,尝试添加新行,然后成功了。

我得出的结论是,在PostgreSQL 10中,DISABLE TRIGGER ALL将禁用外键约束检查。那是预期的行为吗?

详细信息可以找到here

1 个答案:

答案 0 :(得分:4)

是的,这是预期的。

来自"ALTER TABLE"

  

DISABLE/ENABLE [ REPLICA | ALWAYS ] TRIGGER

     

这些表单配置了属于该表的触发器的触发。 (...)可以禁用或启用按名称指定的单个触发器,或表上的所有触发器,或仅禁用用户触发器(此选项不包括内部生成的约束触发器,例如用于实现外键约束或可延迟唯一性的约束)和排除约束)。禁用或启用内部生成的约束触发器需要超级用户特权。应该谨慎行事,因为如果不执行触发器,当然不能保证约束的完整性。 (...)