深入了解Oracle触发器的4种类型(oracle触发器类型)
Oracle触发器是Oracle数据库中常见的一种数据库数据驱动的功能,也是向管理员和数据库程序员提供业务逻辑建模的一种强有力的手段。它可用于定义表的操作,比如更新、插入、删除,并在这些操作被执行时自动执行保护逻辑。 更重要的是,Oracle触发器允许程序员为系统行为编程,以便当系统遇到特定的事件时执行特定的处理。Oracle触发器有四种类型,分别是行触发器、表触发器、数据字典触发器和替代触发器,本文将深入了解他们。
首先是行触发器。为每行执行操作时,行触发器会被激活,并且只能依赖它触发的行中的字段来执行动作。行触发器的主要用途是当数据表行发生了更改时,同时对一些其他字段(可能不再表中)执行一次性操作。例如,以下代码将在插入或更新特定表中的行时对”TOTAL_COST”字段执行动作:
CREATE OR REPLACE TRIGGER trigger_name
AFTER INSERT OR UPDATE ON TableName
FOR EACH ROW –行类型
BEGIN
UPDATE TableName
SET TOTAL_COST = :NEW.amount * :NEW.cost;
END;
其次是表触发器。它不依赖表行中任何字段信息就能运行SQL语句,它们出发一般来自一个操作中涉及的整张表,甚至涉及到多个表。表触发器的动作一般是在整张表的操作之前或者之后发生的,它们可以用于在更改数据前做表校验、在插入新行时提供默认值,也可以在表操作完毕后更新汇总变量。下面的示例展示了如何在用户插入数据之前确保其记录总数不超过10:
CREATE OR REPLACE TRIGGER trigger_name
BEFORE INSERT ON TableName
FOR EACH ROW
DECLARE
count NUMBER;
BEGIN
SELECT COUNT(*) INTO count FROM TableName;
IF count > 10 THEN
RAISE_APPLICATION_ERROR(-20010, ‘TableName has more than 10 rows.’);
END IF;
END;
第三是数据字典触发器。它们被用来监测数据字典表的变动,这些表存储着有关数据库对象,用户和系统状态信息的表。数据字典触发器允许管理员确保数据库安全,因为它们会在发现有关数据字典的变化时及时作出反应。在安全性缺失的情况下,它会立即发出警报,比如一个用户尝试访问一个受限的数据库对象。下面的示例展示了如何检测任何变更’USER_NAME’模式:
CREATE OR REPLACE TRIGGER trigger_name
AFTER UPDATE OF USER_NAME ON SYS.USER$
BEGIN
INSERT INTO audit_user(user_name, creating_date, action)
VALUES (:NEW.USER_NAME, SYSDATE, ‘Update’);
END;
最后是替代触发器,这种触发器可用于实现不同的操作,而无需在应用程序中添加特定的SQL语句。替代触发器可以触发任何SQL语句,包括存储过程,并且可以发送信息到管理员的电子邮箱。下面的示例展示了如何在删除旧记录时发送邮件通知管理员:
CREATE OR REPLACE TRIGGER trigger_name
AFTER DELETE ON TableName
DECLARE
sender VARCHAR2(100) := ‘Sender@domail.com’;
recipient VARCHAR2(100) := ‘Recipient@domail.com’;
title VARCHAR2(100) := ‘Data Changes’;
message VARCHAR2(200) := ‘TableName is changed!’;
BEGIN
UTL_MAIL.SEND(sender, recipient, title, message);
END;
此外,也可以使用Oracle触发器扩展功能,包括管