掌握Oracle触发器的各种类型(oracle触发器类型)
Oracle触发器是在满足特定条件时激活用于在Oracle数据库上对表数据进行操作的特殊类型的存储过程。它在视图,表或其他对象上由数据库触发。它可以直接由用户调用,也可以在发生特定的数据库操作时运行,如在数据表中插入或删除记录。通过触发器,用户可以实现定义何时应该执行操作的条件。
Oracle触发器的范围主要涉及以下三种类型:
1. 行级触发器: 行级触发器详细说明特定表上的某个行。它指定了在表上插入,更新或删除单行记录时,触发器要执行的特定操作。
例如,假设用户需要确保产品表中的每个更改都被记录在一个特定的日志表中,则可以使用行级触发器实现该功能。
CREATE OR REPLACE TRIGGER tr_product_log
AFTER INSERT OR UPDATE OR DELETE ON PRODUCT
BEGIN
IF INSERTING THEN
INSERT INTO PRODUCT_LOG (ID,ACTION,DATED) VALUES(:NEW.ID,’I’,SYSDATE);
ELSIF UPDATING THEN
INSERT INTO PRODUCT_LOG (ID,ACTION,DATED) VALUES(:OLD.ID,’U’,SYSDATE);
ELSE
INSERT INTO PRODUCT_LOG (ID,ACTION,DATED) VALUES(:OLD.ID,’D’,SYSDATE);
END IF;
END;
2. 表级触发器: 表级触发器包括要执行的操作对特定表中所有行都有效。它针对整张表,而不是特定行。
例如,如果用户需要确保在产品表中添加记录之前,每次更新都发送通知电子邮件给特定的部门,则可以使用表级触发器实现该功能。
CREATE OR REPLACE TRIGGER tr_product_email
BEFORE INSERT ON PRODUCT
BEGIN
DECLARE
CURSOR cur IS
SELECT department_id FROM product;
BEGIN
FOR cur_rec IN cur
LOOP
Send_Mail(‘department_id@abc.com’,’Table Updated’);
END LOOP;
END;
END;
3. 级联触发器: 级联触发器定义要在单个表上执行多个触发器之间相互关联的操作。它将触发器链接在一起,当第一个触发器执行成功后,另一个触发器也会自动激活。
例如,假设用户需要在更新客户表时确保日志表中相应的更改也得到记录,可以使用级联触发器实现该功能。
CREATE OR REPLACE TRIGGER tr_cascade_trigger
AFTER INSERT OR UPDATE OR DELETE ON client
FOR EACH ROW
BEGIN
— First trigger
IF INSERTING THEN
INSERT INTO client_log (ID,ACTION,DATED) VALUES(:NEW.ID,’I’,SYSDATE);
ELSEIF UPDATING THEN
INSERT INTO client_log (ID,ACTION,DATED) VALUES(:OLD.ID,’U’,SYSDATE);
else
INSERT INTO client_log (ID,ACTION,DATED) VALUES(:OLD.ID,’D’,SYSDATE);
END IF;
— Second trigger
IF INSERTING THEN
INSERT INTO client_audit (ID,ACTION,DATED) VALUES(:NEW.ID,’I’,SYSDATE);
ELSEIF UPDATING THEN
INSERT INTO client_audit (ID,ACTION,DATED) VALUES(:OLD.ID,’U’,SYSDATE);
ELSE
INSERT INTO client_audit (ID,ACTION,DATED) VALUES(:OLD.ID,’D’,SYSDATE);
END IF;
End;
因此,Oracle触发器有许多类型,它们可以在数据库上的查询,插入,更新和删除操作时执行特定的操作。这些触发器可以很好地自动化一些常见的工作,为用户提供了巨大的方便。