深入学习Oracle触发器的类型及特点(oracle触发器类型)
Oracle的触发器是数据库表和视图中的有效钩子,它允许数据库对特定的数据库操作进行预编程反应。由于触发器被操作系统软件隔离,它可以在没有用户程序员介入的情况下,在任何事物级别中执行或取消数据库操作。
Oracle触发器有以下三种类型,即Statement级别触发器,Row级别触发器和表级别触发器。
Statement级别触发器(DML触发器)是一种针对特定数据库表或视图设计的触发器,在单个语句级别被触发执行,不会触发每一行数据。一个DML触发器可以以后台工作,如果提交一个针对表或视图的操作,触发器会自动被触发。典型的Statement级别触发器如下:
CREATE OR REPLACE TRIGGER sample_trigger
BEFORE INSERT OR UPDATE OR DELETE
ON employee
FOR EACH ROW
BEGIN
— Statements
END;
Row级别触发器(Row触发器)的DML操作同Statement级别触发器相同,它被触发的频率更高,触发器逐行被触发,因此它能够分析或支持一些字段之间的关联,或者对每一行数据进行检查。一个Row触发器可以以后台工作,如果提交一个针对表或视图的操作,触发器会自动被触发,并且每一行被操作的数据,将被一次触发一次。典型的Row级别触发器如下:
CREATE OR REPLACE TRIGGER sample_trigger
BEFORE INSERT OR UPDATE OR DELETE
ON employee
FOR EACH ROW
BEGIN
IF :NEW.salary > 20000 THEN
RAISE_APPLICATION_ERROR(-20001,’Salary of an employee cannot be more than 20000′);
END IF;
END;
表级别触发器是一种紧密钩挂在某表上的触发器,当对特定表执行DML操作时被触发,这种类型的触发器不仅可以采用抑制和取消EML操作的方式管理表,还可以执行代码块和函数,进行完整的功能实现。表级别触发器始终以它所作用的表,为上下文,它不支持FOR EACH ROW子句,也不支持其它表名。典型的表级别触发器如下:
CREATE OR REPLACE TRIGGER sample_trigger
BEFORE INSERT OR UPDATE OR DELETE
ON employee
BEGIN
INSERT INTO log(message) VALUES (‘A dml event has occurred’);
END;
总的来说,Oracle的触发器可以有效的帮助用户实现更多的自动化处理,在大多数场景中,只要想要处理事务性的数据库操作,都可以尝试使用触发器。其中,Statement级别触发器是最常用的,它能够支持一次触发多个DML操作;Row级别触发器具有一行一行被触发的特点,它支持两行之间字段数据比较;表级别触发器不支持行级别操作,但是它可以支持完整的多表操作。