示例 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')