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

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - SQL 的用法 » 存储过程和触发器 » 使用过程、触发器和批处理 » 触发器简介

 

创建触发器

使用 Sybase Central 或 Interactive SQL 创建触发器。在 Sybase Central 中,您可以使用向导提供必要的信息。在 Interactive SQL 中,可以使用 CREATE TRIGGER 语句。对于这两个工具,必须具有 DBA 或 RESOURCE 权限才能够创建触发器,而且必须对与触发器关联的表具有 ALTER 权限。

触发器的主体由一个复合语句组成:一组用 BEGIN 和 END 括起来的 SQL 语句,中间用分号分隔。

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

♦  为给定表创建触发器 (Sybase Central):
  1. 以具有 DBA 或资源权限的用户身份连接到数据库。

  2. 在左窗格中,单击 [触发器]。

  3. 选择 [文件] » [新建] » [触发器]。

  4. 请按照 [创建触发器向导] 中的说明进行操作。

  5. 要填写代码,请在右窗格中单击 [SQL] 选项卡。

♦  为给定表创建触发器 (SQL):
  1. 以具有 DBA 权限的用户身份连接到数据库。还必须对与触发器关联的表具有 ALTER 权限。

  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 别名是表别名,而在行级别触发器中,它们引用所变更的行。

另请参见