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

Posted

技术标签:

【中文标题】是否应该通过 DISABLE TRIGGER ALL 禁用外键约束检查?【英文标题】:Should foreign key constraint checking be disabled by DISABLE TRIGGER ALL? 【发布时间】:2018-08-09 21:04:36 【问题描述】:

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

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

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

详情可见here。

【问题讨论】:

不仅在 Postgres 10 中,而且在所有版本中。毕竟FOREIGN KEY约束是用约束触发器实现的:dba.stackexchange.com/a/102498/3684 【参考方案1】:

是的,这是意料之中的。

来自"ALTER TABLE":

DISABLE/ENABLE [ REPLICA | ALWAYS ] TRIGGER

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

【讨论】:

以上是关于是否应该通过 DISABLE TRIGGER ALL 禁用外键约束检查?的主要内容,如果未能解决你的问题,请参考以下文章

jquery中,.trigger('click');事件和.click();的应用是否同一个道理?

子对象无法将游戏对象添加到其父对象(子对象通过 trigger-collider 获取对象)

数据分析MySQL之不能导入本地文件“Loading local data is disable;”

js判断元素是否是disable状态

SAP Spartacus B2B 页面 Disable Confirmation 对话框的显示原理

为啥 for loop 比它应该更早地刹车?