此语句用于在表中创建触发器。
CREATE TRIGGER trigger-name trigger-time { trigger-event-list | UPDATE OF column-list }
[ ORDER integer ] ON table-name
[ REFERENCING [ OLD AS old-name ]
[ NEW AS new-name ] ]
[ REMOTE AS remote-name ] ]
[ FOR EACH { ROW | STATEMENT } ]
[ WHEN ( search-condition ) ]
compound-statement
trigger-time : BEFORE | AFTER | RESOLVE
trigger-event-list : trigger-event [ , trigger-event ]
trigger-event :
DELETE | INSERT | UPDATE
触发器事件 触发器可以由以下一个或多个事件触发:
DELETE 每当删除关联表中的行时激活。
INSERT 每当有新行插入到与触发器关联的表中时激活。
UPDATE 每当更新关联表中的行时激活。
UPDATE OF column-list 每当更新关联表中的行和修改 column-list 中的列时激活。
您可以为需要处理的每个事件分别编写触发器,或者,如果您有一些共享操作以及一些取决于事件的操作,您可以为所有事件创建触发器并使用 IF 语句区分所发生的操作。
有关详细信息,请参见 IF 语句。
trigger-time 可以定义行级触发器在插入、更新或删除之前 (BEFORE) 或之后 (AFTER) 执行。语句级触发器在语句后 (AFTER) 执行。RESOLVE 触发器时间用于 SQL Remote:它只在行级 UPDATE 或 UPDATE OF 列列表之前触发。
只要行中发生更新,BEFORE UPDATE 触发器就会触发,而不论新值是否与旧值不同。AFTER UPDATE 触发器只在新值与旧值不同时才触发。
FOR EACH 子句 要将触发器声明为行级触发器,请使用 FOR EACH ROW 子句。要将触发器声明为语句级触发器,可以使用 FOR EACH STATEMENT 子句或忽略 FOR EACH 子句。为清楚起见,建议在声明语句级触发器时输入 FOR EACH STATEMENT 子句。
ORDER 子句 同时触发(之前、之后或解析)的同类型触发器可以使用 ORDER 子句确定触发器的触发顺序。指定 ORDER 0 等效于忽略 ORDER 子句。
REFERENCING 子句 REFERENCING OLD 和 REFERENCING NEW 子句允许引用已插入、删除或更新的行。在此子句中,UPDATE 处理为删除后插入。
INSERT 用到 REFERENCING NEW 子句,代表插入的行。但不用 REFERENCING OLD 子句。
DELETE 用到 REFERENCING OLD 子句,代表删除的行。但不用 REFERENCING NEW 子句。
UPDATE 用到 REFERENCING OLD 子句,代表更新前的行;并用到 REFERENCING NEW 子句,代表更新后的行。
REFERENCING OLD 和 REFERENCING NEW 的含义不同,具体取决于触发器是行级还是语句级触发器。对于行级触发器,REFERENCING OLD 子句允许引用更新或删除之前行中的值,REFERENCING NEW 子句允许引用已插入或更新的值。在 BEFORE 和 AFTER 触发器中可以引用 OLD 和 NEW 行。REFERENCING NEW 子句允许在插入或更新操作发生之前在 BEFORE 触发器中修改新行。
REFERENCING REMOTE 子句用于 SQL Remote。它允许引用 UPDATE 语句的 VERIFY 子句中的值。它仅能用于 RESOLVE UPDATE 或 RESOLVE UPDATE OF column-list 触发器。
WHEN 子句 触发器仅对搜索条件计算为真值的行触发。WHEN 子句仅能用于行级触发器。
CREATE TRIGGER 语句创建与数据库中的表关联的触发器,并在数据库中存储触发器。
触发器声明为行级触发器(此情况下,它在每行修改之前或之后执行)或语句级触发器(此情况下,它在整个触发器语句完成后执行)。
必须有 RESOURCE 权限和表的 ALTER 权限,或者必须是表的所有者,或者有 DBA 权限。CREATE TRIGGER 将对表进行表锁定,因此需要对表进行排它使用。
自动提交。
SQL/92 持久存储模块特性。一些子句是供应商扩展。
SQL/99 持久存储模块特性。一些子句是供应商扩展。
Sybase 此语法不同于 Adaptive Server Enterprise 支持的语法。
第一个示例创建行级触发器。当任命一个新的部门经理时,更新该部门中雇员的 manager_id 列。
CREATE TRIGGER tr_manager BEFORE UPDATE OF dept_head_id ON department REFERENCING OLD AS old_dept NEW AS new_dept FOR EACH ROW BEGIN UPDATE employee SET employee.manager_id=new_dept.dept_head_id WHERE employee.dept_id=old_dept.dept_id END
下一个示例更复杂,涉及语句级触发器。首先,按如下所示创建表:
CREATE TABLE "DBA"."t0"
(
"id" integer NOT NULL,
"times" timestamp NULL DEFAULT current timestamp,
"remarks" text NULL,
PRIMARY KEY ("id")
)然后,创建此表的语句级触发器:
CREATE TRIGGER DBA."insert-st" AFTER INSERT ORDER 4 ON
DBA.t0
REFERENCING NEW AS new_name
FOR EACH STATEMENT
BEGIN
DECLARE @id1 INTEGER;
DECLARE @times1 TIMESTAMP;
DECLARE @remarks1 LONG VARCHAR;
DECLARE @err_notfound EXCEPTION FOR SQLSTATE VALUE '02000';
//declare a cursor for table new_name
DECLARE new1 CURSOR FOR
SELECT ID,times,remarks FROM
new_name;
OPEN new1;
//Open the cursor, and get the value
LoopGetRow:
LOOP
FETCH NEXT new1
INTO @id1, @times1,@remarks1;
IF SQLSTATE = @err_notfound THEN
LEAVE LoopGetRow
END IF;
//print the value or for other use
PRINT (@remarks1);
END LOOP LoopGetRow;
CLOSE new1
ENDSQL Anywhere Studio 9.0.2
版权所有 © 1989–2005 Sybase, Inc. 部分版权所有 © 2001–2005 iAnywhere Solutions, Inc. 保留所有权利。