Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SAP Sybase SQL Anywhere 16.0 (中文) » SQL Anywhere 服务器 - SQL 用法 » 存储过程、触发器、批处理和用户定义的函数 » 触发器

 

在表中创建触发器 (SQL)

通过使用 CREATE TRIGGER 语句在表中创建触发器。触发器的主体由一个复合语句组成:一组用 BEGIN 和 END 括起来的 SQL 语句,中间用分号分隔。

前提条件

必须具有 CREATE ANY TRIGGER 或 CREATE ANY OBJECT 系统特权。此外,您必须是触发器所构建于的表的所有者,或者拥有以下其中一种特权:

  • 表的 ALTER 特权
  • ALTER ANY TABLE 系统特权
  • ALTER ANY OBJECT 系统特权

上下文和注释

不能在触发器内使用 COMMIT 和 ROLLBACK 以及某些 ROLLBACK TO SAVEPOINT 语句。

 任务
  1. 连接到数据库。

  2. 执行 CREATE TRIGGER 语句。

结果

新触发器已创建完成。

  • 示例 1:行级 INSERT 触发器   以下触发器是一个行级 INSERT 触发器的示例。它检查为新雇员输入的出生日期是否合理:


    CREATE TRIGGER check_birth_date
       AFTER INSERT ON Employees
    REFERENCING NEW AS new_employee
    FOR EACH ROW
    BEGIN
         DECLARE err_user_error EXCEPTION
       FOR SQLSTATE '99999';
       IF new_employee.BirthDate > 'June 6, 2001' THEN
              SIGNAL err_user_error;
       END IF;
    END;

    注意

    在 SQL Anywhere 示例数据库中,可能已经有一个名为 check_birth_date 的触发器。如果是这样,当尝试运行上述 SQL 语句时,将返回一个错误,指示触发器定义与现有触发器冲突。

    此触发器在有任何行插入 Employees 表之后触发。它会检测并禁止对应出生日期晚于 2001 年 6 月 6 日的任何新行。

    短语 REFERENCING NEW AS new_employee 使用别名 new_employee 以允许触发器代码中的语句引用新行中的数据。

    发出错误信号将导致撤消触发语句以及之前所有的触发器操作结果。

    对于将许多行添加到 Employees 表的 INSERT 语句,check_birth_date 触发器为每一新行触发一次。如果该触发器对任何行触发失败,则 INSERT 语句的所有结果都回退。

    您可以通过将示例的第二行更改为以下内容,指定触发器在插入行之前而非插入行之后触发

    BEFORE INSERT ON Employees

    REFERENCING NEW 子句引用该行的插入值;它与触发器的计时(之前或之后)无关。

    有时,使用声明的参照完整性或 CHECK 约束(而不是触发器)实施约束会更容易。例如,使用列检查约束来实现上例会更简洁、更高效:

    CHECK (@col <= 'June 6, 2001')

  • 示例 2:行级 DELETE 触发器示例   以下 CREATE TRIGGER 语句定义行级别 DELETE 触发器:
    CREATE TRIGGER mytrigger 
    BEFORE DELETE ON Employees
    REFERENCING OLD AS oldtable
    FOR EACH ROW
    BEGIN
       ...
    END;

    REFERENCING OLD 子句与触发器的计时(之前或之后)无关,它使删除触发器代码使用别名 oldtable 来引用所删除的行中的值。

  • 示例 3:语句级 UPDATE 触发器示例   以下 CREATE TRIGGER 语句适合于语句级别 UPDATE 触发器:
    CREATE TRIGGER mytrigger AFTER UPDATE ON Employees
    REFERENCING NEW AS table_after_update
                OLD AS table_before_update
    FOR EACH STATEMENT
    BEGIN
       ...
    END;

    REFERENCING NEW 和 REFERENCING OLD 子句允许 UPDATE 触发器代码引用所更新的行的旧值和新值。表别名 table_after_update 引用新行中的列,表别名 table_before_update 引用旧行中的列。

    对于语句级别触发器和行级别触发器,REFERENCING NEW 和 REFERENCING OLD 子句在意义上稍有不同。对于语句级别触发器,REFERENCING OLD 或 REFERENCING NEW 别名是表别名,而在行级别触发器中,它们引用所变更的行。


 另请参见