创建触发器

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

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

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

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

注:要执行本文档中的教程,必须安装 hr 示例方案,并且必须以 SQL Developer 用户 HR 的身份连接到数据库。

另请参见:

关于 OLD 和 NEW 伪记录

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

对于触发器要处理的行:

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

另请参阅:Oracle AI 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 AI 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. 对于“Base Object(基本对象)”,从菜单中选择“EVALUATIONS”。

    3. 将 INSERT 从可用事件移到所选事件。

      (选择 INSERT,然后单击 > 。)

    4. 取消选择“Statement Level(语句级别)”选项。

    5. 单击 "OK"(确定)。

      即将打开“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. 从“文件”菜单,选择保存

    数据库将编译该过程并进行保存。此时“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 AI Database PL/SQL Language Reference 以了解有关系统触发器的更多信息