创建触发器
要创建触发器,请使用 SQL Developer 的图形界面或 DDL 语句 CREATE TRIGGER。
本节介绍如何使用这两种方式创建触发器。
默认情况下,触发器在创建后处于启用状态。要创建处于禁用状态的触发器,请使用带有 DISABLE 子句的 CREATE TRIGGER 语句。
注:要创建触发器,您必须具有相应的权限;但对于本讨论和简单应用程序的讨论,您不需要此额外信息。
注:要执行本文档中的教程,必须以 SQL Developer 用户 HR 的身份连接到 Oracle Database。
另请参见:
-
Oracle Database PL/SQL Language Reference(了解有关 CREATE TRIGGER 语句的详细信息)
关于 OLD 和 NEW 伪记录
当触触发行级触发器时,PL/SQL 运行时的系统会创建并填充两个伪记录 OLD 和 NEW。它们之所以被称为伪记录,是因为它们仅具有记录的一部分属性,而不是全部。
对于触发器要处理的行:
-
对于 INSERT 触发器,OLD 将不包含任何值,而 NEW 将包含新值。
-
对于 UPDATE 触发器,OLD 将包含旧值,而 NEW 将包含新值。
-
对于 DELETE 触发器,旧值将包含旧值,而 NEW 将不包含任何值。
要引用伪记录,请按照示例 6-1 中所示,在其名称前加上一个冒号:OLD 或 :NEW。
另请参阅: Oracle Database PL/SQL Language Reference 以了解有关旧和新伪记录的更多信息
教程:创建用于记录表更改的触发器
本教程介绍如何使用 CREATE TRIGGER 语句创建触发器 EVAL_CHANGE_TRIGGER,只要 INSERT、UPDATE 或 DELETE 语句更改 EVALUATIONS 表,该触发器将在 EVALUATIONS_LOG 表中添加一行。
该触发器将在触发器语句执行之后添加行,并使用条件谓词 INSERTING 、 UPDATING 和 DELETING 来确定这三个可能的 DML 语句中,哪一个语句触发了触发器。
EVAL_CHANGE_TRIGGER 是一个语句级触发器和 AFTER 触发器。
要创建 EVALUATIONS_LOG 和 EVAL_CHANGE_TRIGGER,请执行以下操作:
-
创建 EVALUATIONS_LOG 表:
CREATE TABLE EVALUATIONS_LOG ( log_date DATE , action VARCHAR2(50)); -
创建 EVAL_CHANGE_TRIGGER:
CREATE OR REPLACE TRIGGER EVAL_CHANGE_TRIGGER AFTER INSERT OR UPDATE OR DELETE ON EVALUATIONS DECLARE log_action EVALUATIONS_LOG.action%TYPE; BEGIN IF INSERTING THEN log_action := 'Insert'; ELSIF UPDATING THEN log_action := 'Update'; ELSIF DELETING THEN log_action := 'Delete'; ELSE DBMS_OUTPUT.PUT_LINE('This code is not reachable.'); END IF; INSERT INTO EVALUATIONS_LOG (log_date, action) VALUES (SYSDATE, log_action); END;
另请参见: Oracle Database PL/SQL Language Reference(了解有关条件谓词的详细信息)
教程:在插入行之前为其创建一个用于生成主键的触发器
本教程介绍如何使用 SQL Developer 的“创建触发器”工具创建一个在向 EVALUATIONS 表中插入行之前触发的触发器,并使用 EVALUATIONS_SEQUENCE 为该行的主键生成唯一编号。
序列 EVALUATIONS_SEQUENCE(在“教程:创建序列”)会为 EVALUATIONS 表生成主键(在其中创建)。但是,这些主键并不会自动插入到表中。
本教程介绍如何使用 SQL Developer 的“创建触发器”工具创建一个名为 NEW_EVALUATION_TRIGGER 的触发器,此触发器将在向 EVALUATIONS 表中插入行之前触发,并使用 EVALUATIONS_SEQUENCE 为该行的主键生成唯一编号。对于触发 INSERT 语句影响的每一行,触发器会触发一次。
NEW_EVALUATION_TRIGGER 是一个行级触发器和 BEFORE 触发器。
创建 NEW_EVALUATION 触发器的步骤:
-
在 "Connections"(连接)框架中,展开 hr_conn 。
-
在方案对象类型列表中,右键单击触发器。
-
在选项列表中,选择新建触发器。
-
在“Create Trigger(创建触发器)”窗口中:
-
在“名称”字段中,键入
NEW_EVALUATION_TRIGGER以替换默认值 TRIGGER1。 -
对于基本对象,从菜单中选择 EVALUATIONS 。
-
将 INSERT 从可用事件移至选定事件。
(选择 INSERT 并选择 > 。)
-
取消选择选项 Statement Level 。
-
选择确定。
即将打开“NEW_EVALUATION_TRIGGER”窗格,其中显示创建该触发器的 CREATE TRIGGER 语句:
CREATE OR REPLACE TRIGGER NEW_EVALUATION_TRIGGER BEFORE INSERT ON EVALUATIONS FOR EACH ROW BEGIN NULL; END;NEW_EVALUATION_TRIGGER 窗格的标题为斜体,这表示该触发器尚未保存在数据库中。
-
-
在 CREATE TRIGGER 语句中,将 NULL 替换为以下文本:
:NEW.evaluation_id := evaluations_sequence.NEXTVAL -
从“文件”菜单,选择保存。
Oracle 数据库将会编译并保存此过程。此时“NEW_EVALUATION_TRIGGER”窗格的标题字体将不再是斜体。
创建 INSTEAD OF 触发器
视图以表的形式呈现查询输出。如果您要像更改表那样更改视图,则必须创建 INSTEAD OF 触发器。该触发器并非更改视图,而是更改基础表。
例如,假设有一个视图 EMP_LOCATIONS,其 NAME 列基于 EMPLOYEES 表的 LAST_NAME 和 FIRST_NAME 列创建:
CREATE VIEW EMP_LOCATIONS AS
SELECT e.EMPLOYEE_ID,
e.LAST_NAME || ', ' || e.FIRST_NAME NAME,
d.DEPARTMENT_NAME DEPARTMENT,
l.CITY CITY,
c.COUNTRY_NAME COUNTRY
FROM EMPLOYEES e, DEPARTMENTS d, LOCATIONS l, COUNTRIES c
WHERE e.DEPARTMENT_ID = d.DEPARTMENT_ID AND
d.LOCATION_ID = l.LOCATION_ID AND
l.COUNTRY_ID = c.COUNTRY_ID
ORDER BY LAST_NAME;
要更新 EMP_LOCATIONS.NAME 视图(在使用 CREATE VIEW 语句创建视图中创建),必须更新 EMPLOYEES.LAST_NAME 和 EMPLOYEES.FIRST_NAME。这就是 Example 6-1 中 INSTEAD OF 触发器的作用。
新记录和旧记录是触发行级触发器时由 PL/SQL 运行时引擎创建和填充的伪记录。OLD 和 NEW 分别存储触发器所处理的记录的原始值和新值。它们之所以被称为伪记录,是因为它们不具有 PL/SQL 记录的全部属性。
示例 6-1 创建 INSTEAD OF 触发器
CREATE OR REPLACE TRIGGER update_name_view_trigger
INSTEAD OF UPDATE ON emp_locations
BEGIN
UPDATE employees SET
first_name = substr( :NEW.name, instr( :new.name, ',' )+2),
last_name = substr( :NEW.name, 1, instr( :new.name, ',')-1)
WHERE employee_id = :OLD.employee_id;
END;
另请参见:
-
Oracle Database PL/SQL Language Reference(了解有关 INSTEAD OF 触发器的详细信息)
-
Oracle Database PL/SQL Language Reference(了解有关 OLD 和 NEW 的详细信息)
教程:创建用于记录 LOGON 和 LOGOFF 事件和触发器
本教程介绍如何使用 CREATE TRIGGER 语句创建两个触发器 HR_LOGON_TRIGGER 和 HR_LOGOFF_TRIGGER。当有人以用户 HR 的身份登录之后,HR_LOGON_TRIGGER 将会在 HR_USERS_LOG 表中添加一行。在有人以用户 HR 身份注销之前,HR_LOGOFF_TRIGGER 将会在 HR_USERS_LOG 表中添加一行。
HR_LOGON_TRIGGER 和 HR_LOGOFF_TRIGGER 都是系统触发器。HR_LOGON_TRIGGER 是 AFTER 触发器,而 HR_LOGOFF_TRIGGER 是一个 BEFORE 触发器。
创建 HR_USERS_LOG、HR_LOGON_TRIGGER 和 HR_LOGOFF_TRIGGER 的步骤:
-
创建 HR_USERS_LOG 表:
CREATE TABLE hr_users_log ( user_name VARCHAR2(30), activity VARCHAR2(20), event_date DATE ); -
创建 HR_LOGON_TRIGGER:
CREATE OR REPLACE TRIGGER hr_logon_trigger AFTER LOGON ON HR.SCHEMA BEGIN INSERT INTO hr_users_log (user_name, activity, event_date) VALUES (USER, 'LOGON', SYSDATE); END; -
创建 HR_LOGOFF_TRIGGER:
CREATE OR REPLACE TRIGGER hr_logoff_trigger BEFORE LOGOFF ON HR.SCHEMA BEGIN INSERT INTO hr_users_log (user_name, activity, event_date) VALUES (USER, 'LOGOFF', SYSDATE); END;
另请参见: Oracle Database PL/SQL Language Reference(了解有关系统触发器的详细信息)