Oracle 11g 的新特性- 组合触发器 (Compound Triggers)

原文出处: http://www.oschina.net/question/12_62292

在以前版本的 Oracle 中,你可通过 FOLLOWS 关键字来控制触发器执行的顺序,例如:

点击(此处)折叠或打开


  1. CREATE OR REPLACE TRIGGER XXX_TRG
  2.    BEFORE INSERT
  3.    ON XXX_TABLE_NAME
  4.    REFERENCING NEW AS NEW OLD AS OLD
  5.    FOR EACH ROW
  6.    FOLLOWS YYY_TRG
  7. DECLARE
  8. BEGIN
  9.    NULL;
  10. END;


?

Oracle 11g 支持名为组合触发器的新特性,其作用跟 FOLLOWS 差不多,只是方式不同。

触发器定时

在了解组合触发器之前,我们先写一个简单的定时触发器。

定时触发器是触发器将要执行的时间,例如 BEFORE STATEMENT, AFTER STATEMENT, BEFORE EACH ROW, 和 AFTER EACH ROW

可以在一个组合触发器做所有的触发动作。
其中,系统指定的执行顺序是: BEFORE STATEMENT => BEFORE EACH ROW => AFTER EACH ROW =>AFTER STATEMENT.

组合触发器指南

a- 组合触发器合并了所有的定时触发器
b- 组合触发器仅限执行 DML 操作,不支持 DDL 和系统操作
c- 你只可在行级代码块中使用 :OLD 和 :NEW 变量标识符 (BEFORE EACH ROW, AFTER EACH ROW
d- 不支持 PRAGMA_AUTONOMOUS_TRANSACTION
e- 你可使用 WHEN 语句来提升触发器性能,但组合触发器不支持
f- 所有的定时触发器共享一个声明部分中的变量,直到事务结束。
g- 允许在组合触发器中重复执行某定时触发器
h- INSERTING, UPDATING 和 DELETING 谓词在组合触发器中仍然有效
i- 解决变异表错误 Resolve mutating table error (ORA-04091)

组合触发器语法:

点击(此处)折叠或打开

  1. CREATE OR REPLACE TRIGGER XXX_TRG
  2.  FOR INSERT OR UPDATE OR DELETE ON XXX_TABLE_NAME
  3.  COMPOUND TRIGGER
  4.     
  5. DECLARE
  6.    --DECLARATION SECTION FOR ALL TRIGGER TIMING USED
  7. BEGIN
  8.   BEFORE STATEMENT IS
  9.   NULL;
  10.     
  11.   AFTER STATEMENT IS
  12.   NULL;
  13.     
  14.   BEFORE EACH ROW IS
  15.   NULL;
  16.     
  17.   AFTER EACH ROW IS
  18.   NULL;
  19.  
  20.   INSTEAD OF ROW IS
  21.   NULL;
  22.  
  23. END;


注意 BEFORE STATEMENT, AFTER STATEMENT, BEFORE EACH ROW 和 AFTER EACH ROW 是可选部分,你可根据需要使用。

INSTEAD OF ROW 只用于数据库视图。

如果你查看数字字典视图 USER_TRIGGERS 你会发现一些新的列 (BEFORE_STATEMENT, BEFORE_ROW, AFTER_ROW, AFTER_STATEMENT, INSTEAD_OF_ROW) ,这些列是跟组合触发器相关的。

结论

组合触发器带来的好处:

1- 在一个地方实现事务(?) 
2- 所有触发器可共享声明段 
3- 维护单元 

4- 解决变异表错误 (ORA-04091)

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30260000/viewspace-1853429/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/30260000/viewspace-1853429/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值