初探Oracle数据库触发器的多种类型(oracle触发器类型)

Oracle数据库触发器是一种在特定表做更改后立即被执行的SQL 代码片段,它更改或检索数据的行为大大加强了数据库的功能、安全性和灵活性。Oracle数据库支持四种类型的触发器,分别是BEFORE触发器,AFTER触发器,INSTEAD OF触发器,和COMBINED触发器,后者是前三种的组合。

BEFORE触发器是在根据触发事件所指定的DML语句执行完毕前立即被触发的触发器。它可以拦截你想要发生改变的行,并在DML语句能够修改数据之前执行一些必要的检查,例如查看插入值是否超出某列的规定范围,以及检查表内字段的唯一性。例如:

CREATE TRIGGER ins_practice
BEFORE INSERT ON practice
FOR EACH ROW
BEGIN
IF :new.salary > 15000 THEN
RAISE_APPLICATION_ERROR(-20000, 'Salary exceeded maximum allowed');
END IF;
END;

AFTER触发器是用来在一组行上完成DML语句操作后立即被触发的触发器,此类触发器可以在DML语句做出更改后在数据库内立即生效,并为表内行带来额外的特性,例如:

CREATE TRIGGER set_date 
AFTER INSERT ON staff
FOR EACH ROW
BEGIN
UPDATE staff
SET join_date = sysdate
WHERE staff_no = :new.staff_no;
END;

INSTEAD OF触发器是对表视图上的INSERT,UPDATE,DELETE操作执行另一触发语句,而不是执行DML语句的一种触发设置。它的最大应用场景在于视图上的插入,更新和删除操作可能并不容易或者不能实现,INSTEAD OF触发器便可以派上用场,它可以实现视图的改变,而不是改变表中的实际数据,例如:

CREATE OR REPLACE TRIGGER view_trigger 
INSTEAD OF INSERT ON employee_vw
BEGIN
INSERT INTO employee (id, name, age)
VALUES(:new.id, :new.name, :new.age);
END;

COMBINED触发器内包含一组BEFORE和AFTER事件触发器,这种形式仅限于 Oracle 11g 及之后的版本,它是执行复杂操作的理想选择,因为它允许在改变表内数据之前或之后都可以执行DML语句。

CREATE OR REPLACE TRIGGER combined
BEFORE INSERT OR UPDATE ON employee
FOR EACH ROW
DECLARE
min_age CONSTANT NUMBER := 20;
BEGIN
IF :new.age
RAISE_APPLICATION_ERROR(-20001, 'Age must be at least' || min_age);
END IF;
AFTER
...
END;

通过以上四种不同类型的Oracle数据库触发器,可以在语句改变数据之前或者之后执行该语句,并且结合不同的条件设定,拥有更好的安全性,也为数据库提供了更强大的灵活性。


数据运维技术 » 初探Oracle数据库触发器的多种类型(oracle触发器类型)