是否在自定义触发之前或之后执行约束?

时间:2014-06-28 15:01:13

标签: sql postgresql triggers order-of-execution

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

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

谢谢

2 个答案:

答案 0 :(得分:3)

我认为Postgres documentation非常明确(我对相关部分的重点):

  

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

因此,“before”或“而不是”触发器不会先执行约束。

答案 1 :(得分:1)

如果在触发后再执行约束,则执行触发。

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