Oracle数据库中的触发器类型(oracle触发器类型)

Oracle数据库中的触发器是一种特殊的系统存储过程,它在发生某种类型的数据库事件时自动触发,并根据要求执行由用户编写的操作。Oracle数据库中的触发器类型分为四种:BEFORE、AFTER、INSTEAD OF和COMBINED。

1. BEFORE触发器,它在操作发生之前执行,不能阻止操作发生或影响其结果,只能改变传递给操作的参数,因此常用于做数据检查、改变值等操作。下面的例子演示如何使用BEFORE触发器,在执行INSERT操作之前对参数值进行检查:

CREATE OR REPLACE TRIGGER salary_check

BEFORE

INSERT ON salaries FOR EACH ROW

BEGIN

IF :NEW.salary >100000 THEN

RAISE_APPLICATION_ERROR(-20010, ‘输入薪水过大!’);

END IF;

END;

2. AFTER触发器就像其名字一样,在操作发生之后执行,不能改变操作的结果,可以修改其它表的值, 因此常用于完成连带的应用程序逻辑,比如记录操作日志等。例如下面的例子对日志表进行更新,记录谁在什么时间做了什么操作:

CREATE OR REPLACE TRIGGER log_upd

AFTER

INSERT OR UPDATE OR DELETE

ON sales

FOR EACH ROW

BEGIN

INSERT INTO log (log_user,log_time,log_action)

VALUES(USER,SYSDATE,SQL);

END;

3. INSTEAD OF触发器可以在操作发生时用自定义的代码来替代发生操作,使用这种触发器可以实现虚拟表。例如创建一个视图,该视图结果中比实际表中数据多100:

CREATE OR REPLACE VIEW view_salary

AS SELECT

id, name, age, salary+100

FROM salary;

CREATE OR REPLACE TRIGGER salary_view

INSTEAD OF

INSERT OR UPDATE OR DELETE

ON view_salary

FOR EACH ROW

BEGIN

IF INSERTING THEN

INSERT INTO salary(id,name,age,salary) VALUES(:new.id, :new.name,:new.age, :new.salary-100);

ELSIF UPDATING THEN

UPDATE salary SET

name=:new.name,age=:new.age, salary =:new.salary-100

WHERE id=:new.id;

ELSIF DELETING THEN

DELETE FROM salary WHERE id=:new.id;

END IF;

END;

4. COMBINED触发器是Oracle中最新的特性,它是一种综合的触发器,可以在before、after和instead of三种触发器之间自由切换,更加灵活实用。

例如创建一个combined触发器,它在插入新数据之前检查参数值,在插入新数据之后更新日志表:

CREATE OR REPLACE TRIGGER salary_combined

BEFORE

INSERT ON salaries FOR EACH ROW

BEGIN

IF :new.salary >100000 THEN

RAISE_APPLICATION_ERROR(-20010, ‘输入薪水过大!’);

END IF;

END;

AFTER

INSERT OR UPDATE OR DELETE

ON salaries

FOR EACH ROW

BEGIN

INSERT INTO log (log_user,log_time,log_action)

VALUES(USER,SYSDATE,SQL);

END;

总之,以上四种Oracle数据库中的触发器都具有自动触发机制、可控性强等特点,可以大大提高数据库操作性能,增强数据库安全性等。这里只是简要介绍这四种类型的触发器,其实实战中还有更多实用的功能。只要熟悉相关知识,就可以更好地利用触发器实现优质的数据库管理服务。


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