Oracle 数据库中的触发器类型(oracle触发器类型)

Oracle 数据库中的触发器是一种在数据库操作时可以自动触发某些事件或动作的特殊程序对象。它可以在数据库中的增删改查操作发生时,自动执行一些用户定义的动作,大大提升数据库维护人员的效率。Oracle 提供了四类不同类型的触发器:Before 触发器,After 触发器,INSTEAD OF 触发器和Compound 触发器,在合适的场景下,选择不同类型的触发器可以实现更好的管理功能及数据安全。

Before 触发器是针对 DML 操作的一种触发器,它会在该 DML 操作开始之前执行,一般可以用来做一些前置检查,决定是否允许操作继续执行。例如,下列 Oracle 数据库语句定义一个名为 chk_age 的 Before 触发器,它会在每次执行更新某个用户属性之前检查是否符合标准:

“`sql

CREATE OR REPLACE TRIGGER chk_age

BEFORE UPDATE ON Users

FOR EACH ROW

BEGIN

IF :NEW.age

RAISE_APPLICATION_ERROR(-20000, ‘Age must be more than 18!’);

END IF;

END;


After 触发器也针对 DML 操作,它会在 DML 操作完成后执行,可以用来往日志(来记录谁执行了哪些操作)或索引等表中更新一些信息,或完成任务的剩余部分等操作。可以使用下列 Oracle 数据库脚本定义在更新用户信息后往日志表中记录更新的情况:

```sql
CREATE OR REPLACE TRIGGER log_update
AFTER UPDATE ON Users
FOR EACH ROW
BEGIN
INSERT INTO USER_LOG VALUES (:NEW.name, 'Update', systimestamp);
END;

INSTEAD OF 触发器针对于视图,它会在尝试修改底层表数据时被触发,用来替换一个 DML 语句。可以借助它把从用户看来改变一个视图的物理数据的操作转换为实际对基础表的操作。例如,下列语句定义一个当更新用户视图时将实际更新实际表的触发器:

“`sql

CREATE OR REPLACE TRIGGER upd_user_insteadOf

INSTEAD OF UPDATE ON users_view

FOR EACH ROW

BEGIN

UPDATE users SET

name = :new.name,

age = :new.age

WHERE id = :old.id;

END;


Compound 触发器同时针对一个 DML 操作中的多个事件(before row, after row, instead of row)定义多个程序块,减少编码量及增强逻辑可控性。下列例子定义一个更新用户信息时做不同类型检查的复合触发器:

```sql
CREATE OR REPLACE TRIGGER chk_user
BEFORE UPDATE ON users
FOR EACH ROW
BEGIN
IF :new.age
RAISE_APPLICATION_ERROR(-20000, 'Age must be more than 18!');
END IF;
IF :new.age > 50 THEN
RAISE_APPLICATION_ERROR(-20000, 'Age must not be more than 50!');
END IF;
END;
CREATE OR REPLACE TRIGGER log_user
AFTER UPDATE ON users
FOR EACH ROW
BEGIN
INSERT INTO USER_LOG VALUES (:NEW.name, 'Update', systimestamp);
END;

以上就是 Oracle 数据库中各类触发器的分类介绍及示例代码。Oracle 数据库触发器是一种实现自动化操作最重要的手段之一,但针对不同场景,应务必选择合适的触发器类型,以收获最大化的效果。


数据运维技术 » Oracle 数据库中的触发器类型(oracle触发器类型)