精通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还提供了两种特殊的触发器:异常处理


数据运维技术 » 精通Oracle触发器:了解5种触发器类型(oracle触发器类型)