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