我是数据库触发器的新手,我坚持这个:
假设我有两个不同的关系,R1和R2,我为其指定了两个“独立”触发器。我的意思是,R1触发TR1,R2触发TR2。并且假设两个触发器都针对同一事件触发。
哪个是他们的执行顺序?
PostrgresSQL文档说明了在相同关系中定义的触发器会发生什么。但是,关于不同关系定义的触发器尚不清楚,但同一事件却触发了它。我想知道,在这种情况下,触发器是否以随机顺序触发。
36.1. Overview of Trigger Behavior:如果为同一事件 定义了多个触发器,触发器名称将按字母顺序触发触发器。在before触发器的情况下,每个触发器返回的可能修改的行成为下一个触发器的输入。如果任何before trigger返回NULL,则该行的操作将被放弃,并且不会触发后续触发器。
答案 0 :(得分:1)
...假设两个触发器都是针对同一事件触发的。
这只能在2种情况下发生(在PostgreSQL中):
这些类型的约束将创建一个触发器以确保参照完整性。如果是外键,(自动)创建的触发器将具有RI_ConstraintTrigger...
SQLFiddle 等名称。同样的规则适用于它们(它们将按其他触发器中的触发器名称按字母顺序触发),除非在一种情况下:它们可以延迟(globally或initially deferred per constraints)。这意味着它们只会在当前交易结束时执行(或者SET CONSTRAINTS
将约束模式从DEFERRED
更改为IMMEDIATE
)。
您还可以使用CREATE CONSTRAINT TRIGGER ...
创建自定义约束触发器,其行为相同。
这在文档中明确提到:
如果触发器函数执行SQL命令,则这些命令可能会再次触发触发器。这称为级联触发器。级联级别的数量没有直接限制。级联可能会导致同一触发器的递归调用;例如,INSERT触发器可能会执行一个命令,该命令会将另一行插入同一个表中,从而导致再次触发INSERT触发器。在这种情况下,触发程序员有责任避免无限递归。
他们的命令很简单,f.ex:
如果UPDATE
上的R1
会触发TR1
UPDATE
R2
,TR2
BEFORE
会触发{{1}}({{1}}触发器):
1) BEFORE triggers of R1 (f.ex. TR1) 1.1) BEFORE triggers of R2 (f.ex. TR2) 1.2) INSTEAD OF triggers of R2 (or do the actual operation) 1.3) AFTER triggers of R2 2) INSTEAD OF triggers of R1 (or do the actual operation) 3) AFTER triggers of R1
继承表不仅不会继承触发器,也不会触发它们的祖先触发器。