深入理解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触发器四种触发器类型,它们可以帮助我们更好地管理数据库表,提高工作效率。