精通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 数据库触发器的开发者,都应该先学会这四种触发器类型,这样才能在应用中更全面地使用它们。


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