精通:Oracle触发器的4种类型(oracle触发器类型)

MySQL触发器是指在指定的时间点或者事件发生时,能够自动执行指定的动作,在Oracle数据库中有4种类型的触发器:before trigger(前触发器)、after trigger(后触发器)、instead of trigger(instead of触发器)和compound trigger(复合触发器),分别有不同的应用场景。

before trigger是指在指定的数据库表上发起更新(INSERT、DELETE和UPDATE)操作前触发,客户端和服务器之间进行数据交换时,客户端上做的所有操作,都将在服务器端发起before trigger,这个触发器的作用就是可以在指定的修改操作发生之前,自动地执行某些操作。通常用来判断发起更新请求的用户是否具有权限,或者在发生更新操作之前做一些处理,比如将被更新数据进行记录备份等。例如:

CREATE OR REPLACE TRIGGER my_before_trigger
BEFORE INSERT OR UPDATE
ON my_table
FOR EACH ROW
BEGIN
-- do something with :new and :old
END;
/

after trigger在指定数据库表上发起更新(INSERT、DELETE和UPDATE)操作后触发,如果before trigger没有发生错误,服务器端会发起after trigger,这种触发器的作用就是执行更新操作后的一些必要的处理,比如释放锁定,以及一些对于数据库表的检查,用来保证服务器端的安全。例如:

CREATE OR REPLACE TRIGGER my_after_trigger
AFTER INSERT OR UPDATE
ON my_table
FOR EACH ROW
BEGIN
-- do something with :new and :old
END;
/

instead of trigger是用于替换原始SQL语句,也就是说,它可以完全替换应用于表上的UPDATE、DELETE或者INSERT语句,甚至可以更新表的内存副本,从而实现更强烈的功能。instead of trigger最常用的场景是在视图上发起更新,但是源表采用不同的处理办法,比如视图更新表后,源表将做某种处理,这种场景下遇到的就是instead of trigger。例如:

CREATE OR REPLACE TRIGGER my_instead_of_trigger
INSTEAD OF INSERT OR UPDATE
ON my_table
FOR EACH ROW
BEGIN
-- do something with :new and :old
END;
/

compound trigger是可以定义在表上,包含before, after和instead of触发器,可以对一个事件进行统一的处理,也就是说,当多种类型的语句更新一个表时,我们可以使用一个compound trigger,而不是分开写三个不同类型的触发器。使用compound trigger也能够在一个触发器里完成多个操作,比如记录更新操作前后的数据等。例如:

CREATE OR REPLACE TRIGGER my_compound_trigger
FOR INSERT OR UPDATE
ON my_table
COMPOUND TRIGGER
/* before trigger */
BEFORE STATEMENT IS
BEGIN
NULL;
END BEFORE STATEMENT;
/* after trigger */
AFTER STATEMENT IS
BEGIN
NULL;
END AFTER STATEMENT;

/* instead of trigger */
INSTEAD OF INSERT OR UPDATE
ON my_table
FOR EACH ROW BEGIN
NULL;
END INSTEAD OF;
END my_compound_trigger;
/

总之,在Oracle数据库中有4种类型的触发器:before trigger(前触发器)、after trigger(后触发器)、instead of trigger(instead of触发器)和compound trigger(复合触发器),各种类型触发器处理不同类型的数据更新操作或者执行特定操作,比如权限校验或者数据备份等,Oracle触发器有助于管理表的数据结构,所以精通:Oracle触发器的4种类型是必不可少的知识。


数据运维技术 » 精通:Oracle触发器的4种类型(oracle触发器类型)