通过使用 CREATE TRIGGER 语句在表中创建触发器。触发器的主体由一个复合语句组成:一组用 BEGIN 和 END 括起来的 SQL 语句,中间用分号分隔。
前提条件
必须具有 CREATE ANY TRIGGER 或 CREATE ANY OBJECT 系统特权。此外,您必须是触发器所构建于的表的所有者,或者拥有以下其中一种特权:
上下文和注释
不能在触发器内使用 COMMIT 和 ROLLBACK 以及某些 ROLLBACK TO SAVEPOINT 语句。
连接到数据库。
执行 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 别名是表别名,而在行级别触发器中,它们引用所变更的行。
![]() |
使用DocCommentXchange讨论此页。
|
版权 © 2013, SAP 股份公司或其关联公司. - SAP Sybase SQL Anywhere 16.0 |