初步探索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_demo
FOR 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_demo
BEGIN
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_demo
FOR 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_demo
COMPOUND 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数据库中触发器类型丰富多样,有多种实现机制,在编程中,根据不同的应用场景可以使用不同类型和触发实现灵活,强大的服务。


数据运维技术 » 初步探索Oracle数据库中触发器类型(oracle触发器类型)