深入理解Oracle数据库中的触发器类型(oracle触发器类型)

Oracle数据库采用触发器来自动执行那些需要随表的DML操作而又无需人工干预的操作,它可以减少复杂的PL/SQL过程和函数的开发、测试和维护的工作量。Oracle数据库中的触发器类型基本有四种:BEFORE触发器、AFTER触发器、INSTEAD OF触发器和ROW触发器。

BEFORE触发器可在update、delete和insert操作发生之前触发,其格式如下:

CREATE [ OR REPLACE ] TRIGGER trigger_name

BEFORE/AFTER [ INSERT | DELETE | UPDATE ] [ OF col_name ] ON tab_name

FOR EACH ROW [ WHEN ( condition ) ]

DECLARE

— declaration

BEGIN

— Executable Statements

END;

假设表tbl_user存在并且字段num为int型,要求实现在每一次更新tbl_user表数据时,num字段值大于100时将num修改成100,则可以创建一个BEFORE触发器,代码如下:

CREATE OR REPLACE TRIGGER tbl_user_upd

BEFORE UPDATE OF num

ON tbl_user

FOR EACH ROW

BEGIN

IF :OLD.num > 100 THEN

:NEW.num := 100;

END IF;

END;

AFTER触发器将在update、delete和insert操作发生之后触发,其格式和BEFORE触发器基本相同,不同之处在于AFTER触发器可以看到已经更改的数据,但不能够更改updated之后的数据,比如:

CREATE OR REPLACE TRIGGER tbl_user_upd

AFTER UPDATE OF num

ON tbl_user

FOR EACH ROW

BEGIN

IF :NEW.num > 100 THEN

DBMS_OUTPUT.PUT_LINE(‘num must less than 100’);

END IF;

END;

INSTEAD OF触发器在update、delete和insert操作发生之前被调用,不过它们不是真正的DML操作,而是将此任务转换成其他任务,并且不需要改变原有的表结构,其格式如下:

CREATE OR REPLACE TRIGGER trigger_name

INSTEAD OF [ INSERT | DELETE | UPDATE ] [ OF col_name ] ON tab_name

FOR EACH ROW [ WHEN ( condition ) ]

DECLARE

— declaration

BEGIN

— Executable Statements

END;

如果要在tbl_user表上提供一个额外的接口,让用户可以通过更新num字段的1/3实现条件写入,而不用更改原有的表结构,可以在tbl_user表中创建一个INSTEAD OF触发器,其代码如下:

CREATE OR REPLACE TRIGGER tbl_user_upd

INSTEAD OF UPDATE OF num

ON tbl_user

FOR EACH ROW

BEGIN

UPDATE tbl_user

SET num = :NEW.num * 1.3

WHERE id = :NEW.id;

END;

最后介绍的是ROW触发器,它可以检测到多个行发生的更新,但ROW触发器只能够用于事务性DML操作,其格式如下:

CREATE [ OR REPLACE ] TRIGGER trigger_name

[ BEFORE | AFTER ]

{ INSERT [ OR ]

UPDATE [ OR ]

DELETE }

ON tab_name

BEGIN

— Executable Statements

END;

如果要执行一个任务,在更新tbl_user表的num字段时,并且要求num的值小于等于30时将num修改成 30,可以使用ROW触发器实现0,其代码如下:

CREATE OR REPLACE TRIGGER tbl_user_upd

AFTER UPDATE

ON tbl_user

BEGIN

FOR i IN (SELECT num FROM tbl_user)

LOOP

IF i.num > 30 THEN

UPDATE tbl_user SET num = 30;

END IF;

END LOOP;

END;

综上所述,Oracle数据库内置了BEFORE触发器、AFTER触发器、INSTEAD OF触发器和ROW触发器四种触发器类型,它们可以帮助我们更好地管理数据库表,提高工作效率。


数据运维技术 » 深入理解Oracle数据库中的触发器类型(oracle触发器类型)