深入理解Oracle的触发器类型(oracle触发器类型)
Oracle的触发器是一种特殊的存储程序,它能够在特定事件发生时自动调用,它不同于存储过程或视图,它不需要显式调用,而是响应用户对数据库的更改,用于执行特定操作。Oracle触发器的核心机制是响应用户在数据表上的更新,增加,删除等操作,当用户在数据表上执行这些操作时,触发器会被调用,执行用户定义的操作。
Oracle支持两种类型的触发器:联机触发器和在线触发器。联机触发器是在DML(Data Manipulation Language)事件发生时执行语句,而在线触发器是在DDL(Data Definition Language)操作发生时触发执行语句。
联机触发器(online trigger)
联机触发器称为BEFORE或AFTER触发器。
联机触发器在提交时被触发,只适用于DML语句(INSERT,UPDATE,DELETE),并且有BEFORE和AFTER子句。BEFORE触发器将在触发事件Q发生之前执行,而AFTER触发器将在该事件发生之后执行。
例如,创建一个用于更新“商品表”中商品单价的联机触发器,将单价更新为所有订单中商品中最高价格:
CREATE OR REPLACE TRIGGER upd_price
AFTER UPDATE
ON orders
FOR EACH ROW
BEGIN
UPDATE Goods
SET Price = (SELECT MAX(price)
FROM Orders
WHERE Goods.goods_id = :new.goods_id)
WHERE Goods.goods_id = :new.goods_id;
END;
在线触发器(offline trigger)
在线触发器是在用户对数据字典中的表做出定义性变更时触发的,只有当用户请求一个DDL操作时才会触发。它只能为CREATE,ALTER,DROP等操作触发,并且只有当所撰写的SQL语句在提交之前才会触发。
例如,可以创建一个记录所有对表上的结构修改的在线触发器:
CREATE OR REPLACE TRIGGER log_change
BEFORE ALTER ON Goods
FOR EACH ROW
BEGIN
INSERT INTO log_table (change_time, username, table_name, action)
VALUES (SYSDATE, USER, ‘Goods’, ‘ALTER’);
END;
总之,Oracle提供了两种类型的触发器,即联机触发器和在线触发器,它们的核心机制是监听用户数据表上的更新、增加、删除等操作,并作出相应反应。联机触发器在DML(Data Manipulation Language)操作发生时被调用,而在线触发器在DDL(Data Definition Language)操作发生时被调用,它们都可以实现灵活的数据库任务。