精通Oracle数据库触发器类型(oracle触发器类型)
Oracle数据库触发器是基于某些条件发生某些动作的程序。一般触发器常见于 RDBMS (关系数据库管理系统)。使用触发器可以极大地提高数据库性能和可编程行为。
常见的 Oracle 数据库触发器类型有四种:
– 状态更改触发器 (Before/After 触发器):该类型的触发器在数据库表中的行受到添加,更新或删除时就会触发;可以设置 before 触发器在事件发生之前,或 after 触发器在事件发生之后被触发。
例如,假设需要在一个 DB 表上创建一个 after 触发器,使其在向表插入数据行之后,将获得的数据字符串的长度作为另一个字段的值:
CREATE OR REPLACE TRIGGER Len_Trigger
AFTER INSERT
ON MyTable
FOR EACH ROW
BEGIN
UPDATE MyTable SET Length = LENGTH (: NEW.MyColumn);
END;
/
– 条件触发器 (Row Level Trigger):这类触发器只能在表的某一行发生特定条件时才会触发,也称为行级触发器。使用这类触发器时,可以考虑到行状态,在特定条件发生时,以类似事务处理方式对其进行处理。
例如,使用 row-level 触发器在“MyTable”上保留历史数据,以便用户可以查看查询时以前的数据:
CREATE OR REPLACE TRIGGER Rn_Trigger
BEFORE UPDATE OR DELETE
ON MyTable
FOR EACH ROW
BEGIN
INSERT INTO MyTable_History
(MyId, MyColumn)
VALUES
(: OLD.MyId, : OLD.MyColumn);
END;
/
– 存储过程触发器 (Statement Level Trigger):这类触发器在特定的 SQL 语句 (DDL 或 DML)被执行时被触发,也称为语句级触发器。
例如,使用语句级触发器可以确保执行 CREATE TABLE 时,表名称必须以“abc_”开头:
CREATE OR REPLACE TRIGGER St_Trigger
AFTER CREATE TABLE
BEGIN
IF (NOT REGEXP_LIKE(LOWER(dml_table_name), ‘^abc_’)) THEN
RAISE_APPLICATION_ERROR(-20001, ‘Table name must start with “abc_”‘);
END IF;
END;
/
– 异常语句触发器 (INSTEAD OF 触发器):该类触发器将代替 DML(数据操作语言),以便在被触发时可以代替表上原有的 DML 语句进行执行,这类触发器一般没有设置触发时机;相反,可以让 INSTEAD OF 触发器在满足特定的条件时进行代替操作。
例如,可以创建一个 INSTEAD OF 触发器,在查询“MyTable”时,将所有数据值替换为用户指定的值:
CREATE OR REPLACE TRIGGER Instead_of_Trigger
INSTEAD OF SELECT
ON MyTable
FOR EACH ROW
BEGIN
SELECT : REPLACEMENT_VALUE
INTO : NEW.MyColumn
FROM DUAL;
END;
/
以上就是 Oracle 数据库触发器的四种常见类型。任何想要精通 Oracle 数据库触发器的开发者,都应该先学会这四种触发器类型,这样才能在应用中更全面地使用它们。