灵活应用:Oracle数据库触发器类型(oracle触发器类型)

介绍

随着信息技术的发展和集成过程越来越复杂,内部系统架构(如Oracle数据库)必须跟上这一步伐,以保障数据在内部系统之间流转的顺畅运行,同时也为客户提供更高的服务水准。Oracle的触发器是一种指令,用于自动调用其他Oracle数据库存储或处理过程以应对特定的数据库行为触发。例如,当用户对特定的表进行插入时可以定义触发器来执行一些额外的任务,如验证插入的数据是否合法,防止重复插入数据,检查关联表中的数据是否正确等。

Oracle数据库中有三种类型的触发器:

一、Before Trigger(之前触发器)

Before Trigger是最常用的触发器,在客户端执行插入、更新或者删除操作时会在真正改变数据库表结构之前触发。例如下面的代码:

CREATE OR REPLACE TRIGGER valid_data

BEFORE UPDATE OR INSERT ON tab_name FOR EACH ROW

BEGIN

IF :NEW.column1 > 1000 THEN

Msg(‘invalid data ‘);

RAISE_APPLICATION_ERROR(-20750,’invalid data ‘);

END IF;

END;

此代码中,触发器会在更新或插入tab_name表之前,检查column1列的值是否大于1000,如果检查为真,则说明这个插入是不合法的,触发器会调用RAISE_APPLICATION_ERROR函数用以报错。

二、After Trigger(之后触发器)

After Trigger 也可以称之为Row Level Trigger,与Before Trigger正好相反,在客户端改变数据库表结构完成之后调用,这种触发器可以进行更为细粒度的操作,例如联合查询,联合更新等。例如下面的代码:

CREATE OR REPLACE TRIGGER update_details

AFTER UPDATE ON tab_name FOR EACH ROW

BEGIN

UPDATE tab2 SET tab2.field2 = :NEW.field1

WHERE tab2.key = :OLD.key;

END;

此代码中,触发器After Trigger被定义在tab_name表上,在更新操作执行完成之后,自动更新tab2表中field2列的值为tab_name表中field1列的值。

三、Compound Trigger(组合触发器)

有的时候触发器的代码很复杂,可能包含Before、After Trigger,以及其它操作,为此,oraacle提供了Compound Trigger 的形式用以方便程序员编写触发器代码。它的关键语法如下:

CREATE [OR REPLACE] TRIGGER trigger_name

{BEFORE|AFTER|INSTEAD OF }

{INSERT [OR] |UPDATE [OR] |DELETE }

[OF column_name]

[ON {table_name | view_name } ]

[REFERENCING OLD AS old_name NEW AS new_name]

[FOR EACH ROW]

[WHEN (condition ) ]

COMPOUND TRIGGER

–Type 1 statement

BEGIN

— Type 2 statements

END;

Compound Trigger中会有Type 1和Type 2两种子触发器。Type 1触发器可以执行Before、After Trigger,以及其它操作,Type 2触发器则只能执行简单和非现场操作。 例如下面的代码:

CREATE OR REPLACE TRIGGER update_log

BEFORE INSERT OR UPDATE OR DELETE ON tab_name

FOR EACH ROW

COMPOUND TRIGGER

— Type 1 statement

BEFORE STATEMENT IS

BEGIN

INSERT INTO tab_log VALUES (sysdate);

END BEFORE STATEMENT;

— Type 2 statement

AFTER EACH ROW IS

BEGIN

IF UPDATING THEN

INSERT INTO tab_log VALUES (:OLD.field1);

END IF;

END AFTER EACH ROW;

END update_log;

此代码中,在记录单一行数据之前,Before Statement子触发器会插入当前时间到日志表中,而在单一行数据更新时,After Eash Row子触发器会将改变前的field1列更新到日志表中。

综上所述,Oracle触发器是Oracle数据库中用来自动应对特定行为事件的最有效方法,使用触发器可以做到一次编程就能完成,可以非常灵活地控


数据运维技术 » 灵活应用:Oracle数据库触发器类型(oracle触发器类型)