创建触发器

要创建触发器,请使用 SQL Developer 的图形界面或 DDL 语句 CREATE TRIGGER。

本节介绍如何使用这两种方式创建触发器。

默认情况下,触发器在创建后处于启用状态。要创建处于禁用状态的触发器,请使用带有 DISABLE 子句的 CREATE TRIGGER 语句。

注:要创建触发器,您必须具有相应的权限;但对于本讨论和简单应用程序的讨论,您不需要此额外信息。

注:要执行本文档中的教程,必须以 SQL Developer 用户 HR 的身份连接到 Oracle Database。

另请参见:

关于 OLD 和 NEW 伪记录

当触触发行级触发器时,PL/SQL 运行时的系统会创建并填充两个伪记录 OLD 和 NEW。它们之所以被称为伪记录,是因为它们仅具有记录的一部分属性,而不是全部。

对于触发器要处理的行:

要引用伪记录,请按照示例 6-1 中所示,在其名称前加上一个冒号:OLD 或 :NEW

另请参阅: Oracle Database PL/SQL Language Reference 以了解有关旧和新伪记录的更多信息

教程:创建用于记录表更改的触发器

本教程介绍如何使用 CREATE TRIGGER 语句创建触发器 EVAL_CHANGE_TRIGGER,只要 INSERT、UPDATE 或 DELETE 语句更改 EVALUATIONS 表,该触发器将在 EVALUATIONS_LOG 表中添加一行。

该触发器将在触发器语句执行之后添加行,并使用条件谓词 INSERTINGUPDATINGDELETING 来确定这三个可能的 DML 语句中,哪一个语句触发了触发器。

EVAL_CHANGE_TRIGGER 是一个语句级触发器AFTER 触发器

要创建 EVALUATIONS_LOG 和 EVAL_CHANGE_TRIGGER,请执行以下操作:

  1. 创建 EVALUATIONS_LOG 表:

     CREATE TABLE EVALUATIONS_LOG ( log_date DATE
                                 , action VARCHAR2(50));
    
  2. 创建 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 触发器的步骤:

  1. 在 "Connections"(连接)框架中,展开 hr_conn

  2. 在方案对象类型列表中,右键单击触发器

  3. 在选项列表中,选择新建触发器

  4. 在“Create Trigger(创建触发器)”窗口中:

    1. 在“名称”字段中,键入 NEW_EVALUATION_TRIGGER 以替换默认值 TRIGGER1。

    2. 对于基本对象,从菜单中选择 EVALUATIONS

    3. INSERT 从可用事件移至选定事件。

      (选择 INSERT 并选择 > 。)

    4. 取消选择选项 Statement Level

    5. 选择确定

      即将打开“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 窗格的标题为斜体,这表示该触发器尚未保存在数据库中。

  5. 在 CREATE TRIGGER 语句中,将 NULL 替换为以下文本:

     :NEW.evaluation_id := evaluations_sequence.NEXTVAL
    
  6. 从“文件”菜单,选择保存

    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;

另请参见:

教程:创建用于记录 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 的步骤:

  1. 创建 HR_USERS_LOG 表:

     CREATE TABLE hr_users_log (
       user_name VARCHAR2(30),
       activity VARCHAR2(20),
       event_date DATE
     );
    
  2. 创建 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;
    
  3. 创建 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(了解有关系统触发器的详细信息)