精通Oracle触发器:了解5种触发器类型(oracle触发器类型)
精通Oracle触发器:了解5种触发器类型
Oracle触发器是用于在特定事件发生时将特定行动行动起来的工具,是Oracle数据库中非常重要的特性之一。它的功能包括在更新表中的数据时同时更新其它表的数据,在插入表中的记录时同时执行特定的字符串,以及在删除表中的记录时同时执行特定程序。在Oracle数据库中,有5种不同类型的触发器,它们都有不同的目的和用途。
首先,row-level 触发器是Oracle数据库中最常见的触发器类型,也是最实用的触发器类型。它可以在删除,插入或更新表中的某一行记录时自动触发。它可以用于跟踪修改数据库表中的行,或者在一条记录被插入或更新时自动调用存储过程。例如可以像如下SQL代码:
CREATE OR REPLACE TRIGGER update_record
AFTER UPDATE OF Emp_Name ON Employees
BEGIN
UPDATE Employees
SET Last_Modified_Date = SYSDATE
WHERE Emp_ID = :new.Emp_ID;
END;
其次,update-level 触发器实际上是row-level 触发器的升级版本,它允许在UPDATE语句中对多行记录进行更新,而不牺牲数据库性能。它的语法格式与row-level 触发器的语法格式基本一致,只是更新活动由单一行更新变为整体更新活动,可以像如下SQL代码:
CREATE OR REPLACE TRIGGER update_record_all
AFTER UPDATE OF Emp_Name ON Employees
BEGIN
UPDATE Employees SET
Last_Modified_Date = SYSDATE
WHERE Emp_Name IN (:old.Emp_Name, :new.Emp_Name);
END;
第三,statement-level 触发器用于在表上对数据进行操作时调用存储过程,而不必检查表中每一行是否受SQL语句影响。比row-level及update-level 触发器,它具有更大的操作范围,可以像如下SQL代码:
CREATE OR REPLACE TRIGGER update_record_pkg
AFTER UPDATE OF Emp_Name ON Employees
BEGIN
Update_Employees_pkg(:new.Emp_Name);
END;
第四,instead-of 触发器可以阻止内置表操作,可以用它来为视图实现insert、update和delete操作。它允许对视图执行DML操作,而无需在原始表上执行任何操作,可以像如下SQL代码:
CREATE OR REPLACE TRIGGER update_vw
INSTEAD OF INSERT, UPDATE, DELETE
ON Employees_vw
DECLARE
BEGIN
IF INSERTING THEN
INSERT INTO Employees
VALUES(:new.Emp_ID, :new.Emp_Name, :new.Salary);
ELSIF UPDATING THEN
UPDATE Employees
SET Emp_Name = :new.Emp_Name,
WHERE Emp_ID = :new.Emp_ID;
ELSIF DELETING THEN
DELETE FROM Employees
WHERE Emp_ID = :old.Emp_ID;
END IF;
END;
最后,compound 触发器可以将多个单独的触发器组合成一个触发器,将复杂的逻辑表达式编程一个触发器中。它允许用户用一个触发器来实现复杂的操作,比较适用于实现复杂的逻辑,可以像如下SQL代码:
CREATE OR REPLACE TRIGGER update_cmpd
BEFORE INSERT OR UPDATE OR DELETE ON Employees
BEGIN
IF DELETING THEN
DELETE FROM Employees;
UPDATE Employees
SET End_Date = SYSDATE
WHERE Emp_ID = Emp_ID;
ELSIF UPDATING THEN
UPDATE Employees
SET Start_Date = SYSDATE,
Emp_Name = :new.Emp_Name
WHERE Emp_ID = :old.Emp_ID;
ELSIF INSERTING THEN
INSERT INTO Employees
VALUES(:new.Emp_ID, :new.Emp_Name, :new.Salary);
END IF;
END;
因此,Oracle提供了5类触发器,它们分别是row-level 触发器、update-level 触发器、statement-level 触发器、instead-of 触发器及compound 触发器,每一种触发器都有自己独特的用途。此外,除了此外,Oracle还提供了两种特殊的触发器:异常处理