初步探索Oracle数据库中触发器类型(oracle触发器类型)
Oracle数据库中触发器(Trigger)被认为是一种若干事件发生时,将某些操作自动进行的一种程序,有利于进行定期任务或作出其他一些相应的处理,是一种非常灵活和有用的工具。根据触发器的实现方式可以将触发器分为以下几种类型:
(1)Row Level Trigger:行触发器是在每一行触发时才执行的触发器,它支持代码段中利用:old和:new 访问旧值和新值,典型情况:update trigger实现软删除,如将flag置为“0”,而不物理删除本行。
例如:
CREATE OR REPLACE Trigger t_demo_trig
before UPDATE ON t_demoFOR EACH ROW
BEGIN IF :NEW.flag = 0 THEN
:NEW;flag := :OLD.flag; END IF;
END;
(2)Statement Level Trigger:语句触发器,这类触发器是一次只会触发一次,而不论涉及行数,每一次触发启动的语句都只执行一次,这类触发器的代码段则没有:old和:new变量,典型调用:触发器调用过程强制完善关联表中缺少的数据。
例如:
CREATE OR REPLACE TRIGGER t_demo_trig
AFTER UPDATE OF flag ON t_demoBEGIN
INSERT INTO t_log(id,flag,update_time) VALUES(:OLD.id,:OLD.flag,SYSDATE);
END;
(3)INSTEAD OF Trigger:INSTEAD OF触发器可以在INSERT、UPDATE、DELETE时,改变原语句定义中有关数据表更新的内容,相当于完全替换现有的表更新语句,典型情况:视图更新强制触发表的更新。
例如:
CREATE OR REPLACE Trigger t_demo_trig
instead of UPDATE ON v_demoFOR EACH ROW
BEGIN UPDATE t_demo SET flag = :NEW.flag WHERE
id = :NEW.id;END;
(4)Compound Trigger:复合触发器可以多次触发,相当于一个复合的触发器会将FOR EACH ROW和BEFORE甚至AFTER的不同行为综合在一起实现复杂的操作,典型情况:当满足某特定条件时,不断调整某字段值,而调整前值要记载下来供参考,如逐行累加数字某个字段,并将历次累加值保存到其他字段。
例如:
CREATE OR REPLACE TRIGGER t_demo_trig
FOR UPDATE OF flag ON t_demoCOMPOUND TRIGGER
BEFORE_EACH_ROW VARCHAR2(128); AFTER_EACH_ROW VARCHAR2(128);
BEFORE STATEMENT BEFORE_EACH_ROW := NULL;
AFTER_EACH_ROW := NULL;
BEFORE EACH ROW BEFORE_EACH_ROW := :NEW.flag;
AFTER EACH ROW AFTER_EACH_ROW := :NEW.flag;
AFTER STATEMENT INSERT INTO t_log(id,beflag,aftflag) VALUES(:OLD.id,BEFORE_EACH_ROW,AFTER_EACH_ROW);
END t_demo_trig;
可以看到,Oracle数据库中触发器类型丰富多样,有多种实现机制,在编程中,根据不同的应用场景可以使用不同类型和触发实现灵活,强大的服务。