洞悉Oracle触发器:它们的类型及其特点(oracle触发器类型)

Oracle 触发器 (trigger) 是一种特殊的数据库对象,可以在表上绑定,它的工作原理是检查是否有新的行插入/更新/删除操作发生,有触发器可以立即执行其定义的动作。它们可以让用户编写动态应用程序和更智能的数据库功能。

Oracle 提供了 3 种类型的触发器,分别为:

1.BEFORE 触发器:BEFORE 触发器会在 DML 操作前执行,无论 DML 操作是否成功都会执行。它的结果可能是修改被更新的行,通过在 trigger 里抛出例外而阻止 DML 操作,或者使用 trigger 做其他附加的工作,如创建额外的审计日志记录。下面的示例显示了一个 BEFORE 触发器,它检查被更新的表(Emp)是否已满。

CREATE OR REPLACE TRIGGER trg_before_emp_insert
BEFORE INSERT ON Emp
FOR EACH ROW
BEGIN
IF (SELECT COUNT(*) FROM Emp) >= 10 THEN
RAISE_APPLICATION_ERROR(-20041, 'Employees table is full');
END IF;
END;

2.AFTER触发器:AFTER 触发器会在 DML 操作成功后立即被执行,在这类触发器里,对新插入/更新/删除的行不会有影响。AFTER 触发器一般用来处理 DML 操作已经成功完成后的一些后处理工作,比如说创建某个特定报表文件,更新某个外部表,或者是备份最近发生的改变。下面的示例显示了一个 AFTER 触发器,它在插入新的行后创建一条新的审计日志记录。

CREATE OR REPLACE TRIGGER trg_after_emp_insert 
AFTER INSERT ON Emp
FOR EACH ROW
BEGIN
INSERT INTO Emp_Audit VALUES (USER, SYSDATE, 'INSERT', 'Name='||:NEW.Name);
END;

3.COMBINED 触发器:COMBINED 触发器又称组合触发器,它的行为表现的是 BEFORE 和 AFTER 触发器合二为一的行为。组合触发器在执行前或执行后都可以修改新/更新/删除的行(ROW),可以在组合触发器里抛出例外,满足一定条件就可以阻止 DML 操作或者其他一些附加的工作可以在组合触发器里实现。下面的示例显示了一个 COMBINED 触发器,它同时完成了检查 Emp 表的工作和创建审计日志。

CREATE OR REPLACE TRIGGER trg_combined_emp_insert 
BEFORE INSERT ON Emp
FOR EACH ROW
BEGIN
IF (SELECT COUNT(*) FROM Emp) >= 10 THEN
RAISE_APPLICATION_ERROR(-20041, 'Employees table is full');
ELSE
INSERT INTO Emp_Audit VALUES (USER, SYSDATE, 'INSERT', 'Name='||:NEW.Name);
END IF;
END;

通过这三种类型的 Oracle 触发器,Web 开发人员和数据库管理员可以把更具体的任务留给数据库服务器,避免无谓的程序开发和维护,提升程序的效率和质量。


数据运维技术 » 洞悉Oracle触发器:它们的类型及其特点(oracle触发器类型)