约束是在自定义触发器之前还是之后执行的?
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】:如果在触发器之后,则先执行约束,然后执行触发器。
如果在触发器之前,则先执行触发器,然后在执行约束之后。
【讨论】:
以上是关于约束是在自定义触发器之前还是之后执行的?的主要内容,如果未能解决你的问题,请参考以下文章