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 触发器删除约束表的数据。