关于触发器
触发器是一个存储在数据库中的 PL/SQL 单元,可以自动执行(“触发”)以响应指定事件。
触发器具有以下结构:
TRIGGER trigger_name
triggering_event
[ trigger_restriction ]
BEGIN
triggered_action;
END;
trigger_name 对方案中的触发器必须是唯一的。触发器可以与方案中的其他对象 (例如某个表) 具有相同名称,但 Oracle 建议使用一种可避免混淆的命名惯例。
如果触发器处于启用状态,则在 trigger_restriction 为 TRUE 或被忽略时,triggering_event 将导致数据库执行 triggerred_action。triggering_event 与表、视图、方案或数据库关联,它可以是以下对象之一:
-
DML statement (described in “About Data Manipulation Language (DML) Statements”)
-
DDL statement (described in “About Data Definition Language (DDL) Statements”)
-
数据库操作(SERVERERROR、LOGON、LOGOFF、STARTUP 或 SHUTDOWN)
如果触发器处于禁用状态,则 triggering_event 不会导致数据库执行 triggerred_action,即使 trigger_restriction 为 TRUE 或被忽略。
默认情况下,触发器在创建后处于启用状态。您可以禁用处于启用状态的触发器,也可以启用处于禁用状态的触发器。
与子程序不同,您不能直接调用触发器。触发器只能由其触发事件调用,而触发事件可由任何用户或应用程序导致。您可能不会察觉到触发器执行,除非它导致了一个未正确处理的错误。
简单触发器可在以下时间点之一准时触发:
-
在执行触发事件之前 ( statement-level BEFORE trigger )
-
在执行触发事件之后(语句级 AFTER 触发器)
-
在事件影响的每行之前(行级 BEFORE 触发器)
-
在事件影响的每行之后(行级 AFTER 触发器)
复合触发器可在多个时间点触发。有关复合触发器的信息,请参阅 Oracle Database PL/SQL Language Reference。
INSTEAD OF 触发器在视图上定义,它的触发事件是一个 DML 语句。Oracle Database 不会执行 DML 语句,而是执行 INSTEAD OF 触发器。有关详细信息,请参阅“创建 INSTEAD OF 触发器”。
系统触发器在方案或数据库上定义。定义在方案上的触发器将会在发生与方案所有者 (当前用户) 关联的各个事件时触发。定义在数据库上的触发器将会在发生与所有用户关联的各个事件时触发。
触发器的一种用途是强制应用适用于所有客户机应用程序的业务规则。例如,假设添加到 EMPLOYEES 表的数据必须具有某种格式,并且有多种客户机应用程序可以向此表中添加数据。通过在此表上定义一个触发器,可确保添加到此表中的所有数据都具有正确的格式。由于该触发器会在任何客户机向此表中添加数据时执行,因此没有客户机可以绕过此规则,并且您只需在触发器中存储和维护用于强制应用该规则的代码,而无需在每个客户机应用程序中执行此操作。有关触发器的其他用途,请参阅 Oracle Database PL/SQL Language Reference。
另请参阅: Oracle Database PL/SQL Language Reference(了解有关触发器的完整信息)