深入浅出:Oracle 触发器类型简介(oracle触发器类型)
Oracle 触发器可以说是一个特殊的存储过程,更准确的说,是由 DDL 或 DML 语句执行引发的一系列操作。它在某些情况下可以替代视图和存储过程。Oracle 触发器可以分为 4 类:row-level triggers、statement-level triggers、INSTEAD OF triggers和 system-triggers.
#### Row-level Triggers
Row-level triggers(行级触发器)是最常用的触发器,它的触发条件可以针对某一行数据,比如 INSERT,UPDATE 和 DELETE 语句。可以利用 row-level triggers,当 INSERT,UPDATE 或 DELETE 语句成功执行后,执行一系列用户定义的操作,比如发送邮件,写日志,更新其他表等。下面是一个简单的 row-level trigger 的例子,它的作用是在每次更新表 Emp 的数据后,将更新时间更新到 Emp_log 表中:
“`sql
CREATE OR REPLACE TRIGGER tr_emp_update
AFTER UPDATE ON Emp
FOR EACH ROW
BEGIN
INSERT INTO EMP_LOG (empid, updated_at)
VALUES (:OLD.empid, SYSTIMESTAMP);
END;
#### Statement-level Triggers
与 row-level triggers 不同,statement-level triggers(语句级触发器)是它的触发条件是针对整条语句,而不是针对某行数据,所以不能使用 :OLD 或 :NEW 这种占位符,也不能使用 FOR EACH ROW 触发子句,而是启用 FOR EACH STATEMENT 。下面是一个简单的 statement-level trigger 的例子,它的作用是在每次更新表 Emp 的数据后,将更新的记录数写入到 Emp_log 表中:
```sqlCREATE OR REPLACE TRIGGER tr_emp_update
AFTER UPDATE ON Emp FOR EACH STATEMENT
BEGIN INSERT INTO EMP_LOG(updated_at, affected_rows)
VALUES (SYSTIMESTAMP, SQL%ROWCOUNT);END;
#### INSTEAD OF Triggers
INSTEAD OF triggers(代替型触发器)是 Oracle 提供的特殊类型触发器,它可以用来替换 DML 语句本身,而不是在某一操作后执行一系列操作,因此 INSTEAD OF 型触发器不能像前面的 row-level 或 statement-level 触发器一样返回多条结果,也不能记录操作记录,这也是它和前面两种触发器的最大不同之处。下面是一个应用 INSTEAD OF trigger 的例子,如果用户想更新 Emp 表的 JOIN_DATE 字段为当前时间,那么我们可以利用它来更新其他字段,比如是否审核,是否有效等。
“`sql
CREATE OR REPLACE TRIGGER tr_emp_update
INSTEAD OF UPDATE ON Emp
BEGIN
UPDATE EMP
SET JOIN_DATE = SYSDATE,
STATUS = 1
WHERE EMPID =:OLD.EMPID;
END;
#### System-triggers
System-triggers(系统触发器)是 Oracle 为特定场景提供的,它将在特定条件自动触发,通常用于管理任务,比如系统启动或锁定时自动启动任务。System-triggers 可以分为 login-level triggers 和 server-level triggers 。login-level triggers 是登录触发器,当用户登录时触发;server-level triggers 是服务器触发器,当重启服务器时触发执行。下面是一个应用 server-level trigger 的例子,它的作用是每次服务器重启时,将服务器的心跳信息写入数据库日志表:
```sqlCREATE OR REPLACE TRIGGER tr_server_start
AFTER STARTUP ON DATABASEBEGIN
INSERT INTO SERVER_LOG (server_name, updated_at) VALUES ('My Server', SYSTIMESTAMP);
END;
以上就是Oracle 触发器类型的简介,Oracle 触发器不仅可以代替视图和存储过程,而且还可以让某些操作可以更加精准的执行,非常适合在特殊场景下使用。