11.2.4 触发器执行顺序

在同一对象上可以作用多个触发器,因此触发器被激发的顺序是有先后关系的。其触发顺序如下:

1)首先被触发的将是前语句级触发器(before statement trigger),该触发器会被执行一次。

2)如果有行级的触发器则接下来执行前行级触发器(before row trigger),行级触发器执行的次数同SQL修改的记录次数一致。

3)当SQL修改记录完成后会触发行级触发器,这时候的行级触发器为后行级触发器(after row trigger),该类型触发的次数同SQL修改记录的次数一致。

4)执行一次语句级的触发器,此时的语句级触发器为后语句级触发器(after statement trigger)。

如果多个相同类型的,相同事件触发器作用在同一个对象上,如果在Oracle 11g之前,那么最终被执行的会有一定的随机性,而在Oracle 11g中利用FOLLOWS可以控制其顺序。

【示例9】控制触发器的顺序

触发器执行顺序分为以下两个步骤:

1)创建前面介绍过的PRODUCTINFO_OPER_TGR触发器。该触发器为行级触发器,激发时机为前触发,作用在PRODUCTINFO表上。

2)创建触发器PRODUCTINFO_OPER_ORD_TGR,该触发器利用FOLLOWS控制其在PRODUCTINFO_OPER_TGR后触发,否则默认在PRODUCTINFO_OPER_TGR前触发。具体脚本如下:


01 CREATE TRIGGER PRODUCTINFO_OPER_ORD_TGR

02 BEFORE INSERT

03 ON PRODUCTINFO

04 FOR EACH ROW

05 FOLLOWS PRODUCTINFO_OPER_TGR

05 BEGIN

07 DBMS_OUTPUT.PUT_LINE('触发器顺序测试');

08 END;


【代码解析】

❑第1行表示创建触发器,名为PRODUCTINFO_OPER_ORD_TGR。

❑第2行表示该触发器为前触发,触发事件是INSERT。

❑第3行表示该触发器作用在表PRODUCTINFO上。

❑第4行表示为行级触发器。

❑第5行表示该触发器在PRODUCTINFO_OPER_TGR之后被激发。

【执行效果】

在SQL*Plus下执行脚本,如果成功,则提示如下:


触发器已创建


【验证触发器】

创建以上触发器,执行增加数据SQL语句。执行效果见图11.11。

11.2.4 触发器执行顺序 - 图1

图 11.11 使用顺序控制

此时可以看出PRODUCTINFO_OPER_ORD_TGR触发器在PRODUCTINFO_OPER_TGR之后被激发,这是使用FOLLOWS语句的结果(见第5行)。如果不加该语句,那么触发器被激发的顺序正好相反,效果这里不再给出,感兴趣的读者可以自行实验。