学习Oracle中触发器的类型及特点(oracle触发器类型)
Oracle的触发器(Trigger)可以说是Oracle数据库结构和设计的重要组成部分,它可以实现灵活的自动响应,也是一个不可忽视的功能。在Oracle中,一共支持五种类型的触发器,分别是Statement-level触发器,Row-level触发器,BEFORE触发器,AFTER触发器和INSTEAD OF触发器。
Statement-level触发器是触发器中最基本也是最常用的触发器。它是在SQL语句执行任何行改变前后都会触发,是实现范围最广的触发器类型。例如实现一个检查工资是不是超出工资的最高额度的触发器,就可以采用Statement-level触发器。语法形式示例如下:
CREATE OR REPLACE TRIGGER pay_limit
BEFORE INSERT OR UPDATE ON salary
FOR EACH STATEMENT
DECLARE
p_salary number;
BEGIN
SELECT MAX (salary) INTO p_salary FROM salary;
IF :NEW.salary > p_salary THEN
raise_application_error(-20001,’the salary exceeding the max’);
END IF;
END;
Row-level触发器由于和Statement-level触发器非常相似,很容易就被混淆。它是在每一行执行前后触发,适用于单行操作,例如日志记录等,它们对执行语句是不敏感的,如果有多条操作语句,它只会触发一次;而Statement-level触发器不管有多少行操作,都会触发一次。语法形式示例如下:
CREATE OR REPLACE TRIGGER row_pay_limit
BEFORE INSERT OR UPDATE ON salary
FOR EACH ROWS
DECLARE
p_salary number;
BEGIN
SELECT MAX (salary) INTO p_salary FROM salary;
IF :NEW.salary > p_salary THEN
raise_application_error(-20001,’the salary exceeding the max’);
END IF;
END;
BEFORE触发器用于在某项操作发生前执行某项操作,只要有任何改变就会触发,这就是BEFORE触发器的一个特点。它的语法形式也与Statement-level和Row-level触发器相同,可以修改要改变的数据,部分语法如下:
CREATE OR REPLACE TRIGGER salary_check
BEFORE INSERT OR UPDATE ON salary
FOR EACH ROWS
BEGIN
IF :NEW.salary > :OLD.salary THEN
raise_application_error(-20001,’salary can not increase’);
END IF;
END;
AFTER触发器用于在某项操作发生后执行某项操作,只要有任何改变都会触发,这也是AFTER触发器的一个特点。它的语法形式和BEFORE类似,部分语法如下:
CREATE OR REPLACE TRIGGER pay_check
AFTER INSERT OR UPDATE ON salary
FOR EACH ROWS
BEGIN
–将生效的工资写入salary_record表中
INSERT INTO salary_record (worker_id, salary ) VALUES (:NEW.worker_id,:NEW.salary);
END;
INSTEAD OF触发器用于取代原有操作,它可以用于视图和触发器,也就是说与视图关联的触发器可以使用INSTEAD OF类型;而基于表或试图的其他触发器类型则不行。因此INSTEAD OF触发器适合在某些场景下使用,语法样例如下:
CREATE OR REPLACE TRIGGER emp_inst
INSTEAD OF INSERT ON emp_view
FOR EACH ROWS
BEGIN
INSERT INTO emp (emp_no,em_name) VALUES (:NEW.emp_no,:NEW.em_name);
END;
以上就是Oracle中五种触发器类型的介绍,从上面可以看出,每种触发器在实际使用中都有其自身的特点,在使用的时候根据情况选择合适的触发器类型是很重要的。