深入理解 Oracle 触发器类型(oracle触发器类型)
Oracle 触发器是由一组存储于数据库中的特殊程序来检测每条数据库操作,并根据该操作执行一些代码。 Oracle 触发器可以自动执行的动作,用于完成复杂的任务,比如检查数据完整性或强制新的业务规则。Oracle 数据库提供了四种类型的触发器:BEFORE 触发器、AFTER 触发器、INSTEAD OF 触发器和Compound 触发器。
BEFORE 触发器主要用于在实际实施 SQL 语句之前进行校验,确保满足一定条件后才能执行。它可以执行在添加、修改或删除操作执行之前执行的附加动作,比如在添加时给数据库系统添加要求,也可以保护数据库中存储的数据不至于被删除、修改或添加。这种触发器可以返回一个取消信号,在其中编写的触发器程序返回错误状态后就不会实际执行SQL 语句。下面是一个使用 BEFORE 触发器的实例代码:
CREATE OR REPLACE TRIGGER trig_before
BEFORE INSERT ON students
FOR EACH ROW
DECLARE
BEGIN
IF :new.score
RAISE_APPLICATION_ERROR (-20000, ‘Score is invalid.’);
END IF;
END;
AFTER 触发器是在表的操作已经完成之后调用的,AFTER 触发器可以执行一些清理操作,比如日志记录、更新统计信息等。AFTER触发器不可以对触发事件本身 所执行的操作修改,它们只能对原始数据库表做一些其他的改变。下面是一个使用 AFTER 触发器的实例代码:
CREATE OR REPLACE TRIGGER trig_after
AFTER INSERT ON students
FOR EACH ROW
DECLARE
BEGIN
INSERT INTO log (student_id, action, timestamp)
VALUES (:new.id, ‘Student Added’, CURRENT_TIMESTAMP);
END;
INSTEAD OF 触发器受到表的操作执行完成之前进行拦截,能改变原本要执行的 DML。INSTEAD OF 触发器可以允许我们在操作表时,替换表的操作为我们所需要的操作内容,比如添加一些额外的条件或进行集合操作等等。下面是一个使用 INSTEAD OF 触发器的实例代码:
CREATE OR REPLACE TRIGGER trig_insteadof
INSTEAD OF DELETE ON students
FOR EACH ROW
DECLARE
BEGIN
IF :old.score > 60 THEN
DELETE FROM students WHERE id = :old.id;
ELSE
RAISE_APPLICATION_ERROR (-20000, ‘Low scores can not be deleted.’);
END IF;
END;
Compound 触发器是由多个唯一触发器组成的触发器组。当以特定的顺序触发器组一起工作时,我们可以使用Compound触发器,如果想要一次执行一系列的触发器,也可以使用Compound触发器。下面是一个使用 Compound 触发器的实例代码:
CREATE OR REPLACE TRIGGER trig_compound
COMPOUND TRIGGER
AFTER DELETE OR INSERT OR UPDATE ON students
FOR EACH ROW
BEFORE STATEMENT IS
DECLARE
BEGIN
IF :new.score
RAISE_APPLICATION_ERROR (-20000, ‘Score is invalid.’);
END IF;
END;
AFTER STATEMENT IS
BEGIN
INSERT INTO log (student_id, action, timestamp)
VALUES (:new.id, ‘Student Updated’, CURRENT_TIMESTAMP);
END;
END trig_compound;
从上面的示例可以看出,Oracle 中提供了4 种不同类型的触发器,每种类型有各自的用途,扩展大家对 Oracle 触发器的使用,深入理解这些不同类型触发器的功能以及如何以最优的方式使用它们,极大地提高我们的开发效率和代码的稳定性。