约束是在自定义触发器之前还是之后执行的?

Posted

技术标签:

【中文标题】约束是在自定义触发器之前还是之后执行的?【英文标题】:Are constraints executed before or after customized trigger? 【发布时间】:2014-08-19 12:32:14 【问题描述】:

触发器和约束的执行顺序是什么? 例如,如果我插入了一个错误的外键,这个 fk 会在我自己的触发器之前(BEFORE 或 AFTER)被 pgsql 检测到吗?

我知道触发器内的异常将回滚在同一触发器内执行的任何更新/插入(即使对于 AFTER 触发器),但对于约束是否相同?外键约束是否会从我自己的触发器回滚我的所有插入/更新?

谢谢

【问题讨论】:

【参考方案1】:

我认为Postgres documentation 对此非常清楚(我对相关部分的突出显示):

可以指定触发器在尝试操作之前触发 在一行上(在检查约束之前和 INSERT、UPDATE 或 尝试删除);或在操作完成后(之后 检查约束并且 INSERT、UPDATE 或 DELETE 具有 完全的);或者代替操作(在插入的情况下, 更新或删除视图)。如果触发器在之前触发或改为触发 的事件,触发器可以跳过当前行的操作, 或更改正在插入的行(对于 INSERT 和 UPDATE 操作 只要)。如果触发器在事件之后触发,则所有更改,包括 其他触发器的效果对触发器是“可见的”。

因此“之前”或“代替”触发器不会首先执行约束。

【讨论】:

正确我应该使用文档而不是谷歌。为了回答我的第二个问题,抛出错误的约束(或另一个触发器)将取消我的触发器(之前或之后)将完成的更新/插入。 其他 DBMS 通常也是这样吗?【参考方案2】:

如果在触发器之后,则先执行约束,然后执行触发器。

如果在触发器之前,则先执行触发器,然后在执行约束之后。

【讨论】:

以上是关于约束是在自定义触发器之前还是之后执行的?的主要内容,如果未能解决你的问题,请参考以下文章

Sqlserver中存储过程,触发器,自定义函数

自定义git触发编译脚本

自定义 UIControl(滑块)在与交互之前不遵守约束

在标准任务之前/之后自动运行自定义任务

如何写自定义 React Hook?

APEX初步 [3] —— Apex触发器