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