oracle:触发器,自治事务,instead of trigger,trigger

触发器的格式:

CREATE [OR REPLACE ] TRIGGER trigger_name
{BEFORE| AFTER} {UPDATE| INSERT| DELETE|SELECT} ON table_name
[FOR EACH ROW]
[FOLLOWS another_trigger]
[ENABLE| DISABLE] [WHEN condition] DECLARE xxxx; BEGIN NULL; [EXCEPTION] END;

这是一般的触发器格式。

BEFORE|AFTER:选择触发器在 DML操作之前还是之后发生。

不知道触发器能不能够对 SELECT 起作用,应该可以的。

FOR EACH ROW:指定行触发器,只适用于UPDATE,INSERT,DELETE。

FOLLOWS,指定触发器的顺序,11g 以后使用的。

ENABLE|DISABLE:指定触发器启用还是禁用。(默认启动)

或者通过下列语句

ALTER TRIGGER trigger_name {ENABLE|DISABLE};

 

WHEN:指定执行触发器时必须要满足的条件。

一个表被删除,则定义在这表上的触发器也会被删除。

注意:

1.触发器也许不会执行事务控制语句,e.g.COMMIT、SAVEPOINT、ROLLBACK.当触发器执行是,所有执行的操作会称为事务的一部分。当事务被提交或滚回,触发器的才做也会提交或滚回。如果想跳出此规则可以通过 自治事务

2.触发器调用任何的函数或者过程也许不会执行事务控制语句。除非包含 自治事务

3.不允许在触发器中声明LONG 或者 LONG RAW 变量。

 

触发器中包含两个伪记录,分别为  :NEW 、 :OLD,使用时包括冒号,用于标识新的数据(INSERT时的)、旧的数据(delete时的)或者UPDATE则两者都有。逻辑上不存在时被设置为 NULL

这两者可以看做RECORD 使用。

 

触发器中提供布尔函数检查触发的是DML中何种状态,如下:

CREATE TRIGGER trigger_name 
AFTER UPDATE OR DELETE ON table_name
DECLARE
  v_type VARCHAR(20);
BEGIN
  IF UPDATING THEN
     v_type  := 'updating' ;
  ELSIF DELETING THEN
     v_type := 'deleting';
  END IF;
  xxxxxxx;
END;

 

 

自治事务:

    由其他事务(通常称为主事务)发起的独立事务。也就是说,自治事务也许会执行多个DML语句,并且提交或者滚回操作,而不会提交或者滚回主事务执行的DML语句。

 例子:

    有一个触发器,在table 执行UPDATE 之后被触发,以记录审计数据。假设你希望即使主事务失败,仍旧能够记录审计数据(即触发器操作仍然有效)。这样可以通过 自治事务实现。

 语法:

CREATE OR REPLACE TRIGGER trigger_name
AFTER UPDATE ON table_name
DECLARE
  xx;
  PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  xx;

  COMMIT;
END;

 

PRAGMA  AUTONOMOUS_TRANSACTION;  和 COMMMIT; 语句是必须的。

 

代替触发器(INSTEAD OF 触发器)

代替触发器定义于视图

CREATE OR REPLACE trigger_name
INSTEAD OF DELETE ON table_name
BEGIN
  xxxx;
END;

 

假如在一个视图上进行删除操作,但是有完整性约束,可以通过INSTEAD OF 触发器删除约束表的数据。

 

posted @ 2012-09-12 23:17  A_zhu  阅读(8683)  评论(0编辑  收藏  举报