《触发器的创建和使用》由会员分享,可在线阅读,更多相关《触发器的创建和使用(6页珍藏版)》请在金锄头文库上搜索。
1、触发器的创建和使用 一、 触发器的优点 触发器是自动执行的。当对表中的数据做任何修改(比如手工输入或者应用程序 采取的操作)之后立即被激活。 触发器可以通过数据库中的相关表进行层叠更改。例如,可以子啊 t_student 表 的 s_number 列上写入一个删除触发器,以使 t_score 表中的各匹配行采取删除操 作。该触发器用 s_number 列作为唯一键,在 t_score 表中对各匹配行进行定位。 触发器可以强制限制。这些限制比用 CHECK 约束所定义的更复杂。与 CHECK 约束 不同的是,触发器可以引用其他表中的列。 二、 触发器的类型 AFTER 触发器:这种烈性的触发器将
2、在数据变动(INSERT、UPDATE 和 DELETE 操 作)完成以后才被出发。可以对变动的数据进行检查,如果发现错误,将拒绝接 受或回滚变动的数据。AFTER 触发器只能在表上定义。在同一个数据表中可以创 建多个 AFTER 触发器。 INSTEAD OF 触发器:INSTEAD OF 触发器是 SQL Server 2000 中新增的功能。这种 类型的触发器将在数据变动以前被触发,并取代变动数据的操作 (INSERT、UPDATE 和 DELETE 操作) ,而去执行触发器定义的操作。INSTEAD OF 触发器可以在表或视图上定义。在表或视图上,每个 INSERT、UPDATE 和
3、DELETE 语句最多可以定义一个 INSTEAD OF 触发器。 三、 注意事项 CREATE TRIGGER 语句必须是批处理中的第一个语句。将该批处理中随后的其他 所有语句解释为 CREATE TRIGGER 语句定义的一部分。 创建触发器的权期限默分配给表的所有者,且不能讲该权限转给其他用户。 触发器为数据库对象,其名称必须遵循标识符的命名规则。 只能在当前数据库中创建触发器但触发器可以应用当前数据库以外的对象。 TRUNCATE TABLE 语句不会引发 DELETE 触发器。 WRITETEXT 语句不会引发 INSERT 或 UPDATE 触发器。 四、 使用 Transact-
4、SQL 语句创建触发器 (1) 语法 CREATE TRIGGER trigger_name ON table|view FOR | AFTER | INSTEAD OF DELETE , INSERT , UPDATE WITH APPEND NOT FOR REPLICATION AS IF UPDATE(column) AND|ORUPDATE(column) . . .n | IF (COLUMNS_UPDATED()bitwise_operatorupdated_bitmask)comparison_operatorcolumn_bitmask . . .n sql_statemen
5、t . . .n (2) 代码意义 trigger_name:用于指定触发器的名称。触发器的名称必须符合 SQL Server 标识符规则,并且其名称在当前数据库中必须是唯一的。另外,还 可以选择是否指定触发器所有者的名称。 table|view:用于指定在其上执行触发器的表或视图,有时称为触发器表或 触发器试图。可以选择是否指定表或视图的所有者名称。 WITH ENCRYPTION:用于加密 syscomments 表中包含 CREATE TRIGGER 语句文本的条目。使用 WITH ENCRYPTION 可防止触发器作为 SQL Server 复制的一部分发布。 AFTER:用于规定此触
6、发器只有在触发 SQL 语句中指定的所有操作都已成 功执行后才激发。所有的应用级联操作和约束检查也必须成功完成后,才 能执行触发器。如果仅指定 FOR 关键字,则 AFTER 是默认设置。注意该类 型触发器仅能在表上创建,而不能在视图上定义该触发器。 INSTEAD OF:用于规定执行的是触发器而不是执行触发器 SQL 语句,从 而用触发器替代触发语句的操作。在表或视图上,每个 INSERT、UPDATE 或 DELETE 语句最多可以定义一个 INSTEAD OF 触发器。INSTEAD OF 触发 器不能在 WITH CHECK OPTION 的可更新视图上定义。如果只向指定的 WITH
7、CHECK OPTION 选项的可更新视图添加 INSTEAD OF 触发器,SQL Server 将产生一个错误。用户必须用 ALTER VIEW 删除该选项后才能定义 INSTEAD OF 触发器。 DELETE , INSERT , UPDATE :用于指定在表或视图上执行哪些数据 修改语句时将激活触发器的关键字。必须至少指定一个选项。在触发器定 义中允许以任意顺序组合这些关键字。如果指定的选项多余一个,需用逗 号分隔这些选项。 WITH APPEND:用于指定应该添加现有类型的其他触发器。只有当兼容 级别(指某一数据库行为与以前版本的 SQL Server 兼容程度)是 65 或更低
8、时,不应执行该触发器。 NOT FOR REPLICATION:表示当复制进程更改触发器所涉及的表时,不应执 行该触发器。 AS:触发器要执行的操作。 sql_statement:触发器的条件和操作。触发器条件指定其他准则,以确定 DELETE、INSERT 或 UPDATE 语句是否导执行定触发器操作。 IF UPATE(column):用于测试在指定的列上进行的 INSERT 或 UPDATE 操作, 不能用于 DELETE 操作,可以指定多列。因为在 ON 字句中指定了表名,所 以在 IF UPDATE 子句的列名前不要包含表名。若要测试在多个列上进行的 INSERT 或 UPDATE
9、操作,请在第一个操作后指定单独的 UPDATE(column)子句。在 INSERT 操作中,IF UPDATE 将返回 TRUE 值, 因为这些列插入了显示值或隐形值(NULL) 。 IF(COLUMNS_UPDATED():用于测试是否插入或更新了所涉及的列,仅用 于 INSERT 或 UPDATE 触发器。 bitwise_operator:用于比较运算的位逻辑运算符。 updated_bitmask:整型位掩码,表示实际更新或插入的列。例如,表 t1 包 含 C1、C2、C3、C4 和 C5。假定表 t1 上有 UPDATE 触发器,若要检查列 C2、C3 和 C4 是否都已更新,则指
10、定值 14;若要检查是否只有列 C2 已更 新,则指定值 2。 comparison_operato:比较运算符。使用等号(=)检查 updated_bitmask 中指定的所有列是否都实际进行更新。使用大于号()检查 updated_bitmask 中指定的任一列或某些列是否已更新。 column_bitmask:检查列的整型位掩码,用来检查是否已更新或插入了这 些列。 (注:当创建触发器时,如果使用了相同名称的触 发器,后建立的触发器将会覆盖 前面简历的触发器。用户不能在系 统表上创建用户自定义 的触发器。 ) (3) 临时表 inserted 表中存储着被 ISNERT 和 UPDATE
11、 语句影响的新的数据行。执行 DELETE 或 UPDATE 语句时,新的数据行被添加到基本表中,同事这些数据行的 备份复制到inserted临时表中。 deleted 表中存储着被DELETE 和UPDATE 语句影响的旧数据行。执行 INSERT 或 UPDATE 操作时,指定的数据行从基本表中删除,然后被转移到 deleted表 中,然后将新的数据行同事插入基本表和inserted表中。 五、 示例 (1) AFTER UPDATE、INSERT触发器 USE student IF EXISTS(SELECT 那么FROM sysobjects WHERE name=scoreCheck
12、AND type=TR ) DROP TRIGGER scoreCheck GO CREATE TRIGGER scoreCheck ON t_score FOR INSERT,UPDATE AS IF UPDATE(score) PRINT AFTER触发器开始执行 BEGINDECLARE ScoreValue realSELECT ScoreValue=(SELECT score FROM inserted) IF ScoreValue100 OR ScoreValue0 PRINT 输入的分数有误,请确认输入的考试分数! END GO 触发scoreCheck USE student
13、GOPRINT 在t_score中插入记录时触发器执行结果: PRINT INSERT INTO t_score VALUES(9952123,20010203,-35) INSERT INTO t_score VALUES(9952124,20010203,152) GO PRINT在t_score中修改记录时触发器执行结果: PRINT UPDATE t_score SET score=115 WHERE s_number=9952123 UPDATE score=-65 WHERE s_number=9952124 (2) AFTER DELETE触发器 USE student GO I
14、F EXISTS(SELECT name FROM sysobjects WHERE name=Stu_DeteleAND type=TR) DROP TRIGGER Stu_Delete GO CREATE TRIGGER Stu_Delete ON t_student FOR DELETE ASPRINT 删除触发器开始执行DECLARE StuNum char(10)PRINT 把在t_student表中删除的记录的s_number赋值给局部变量 SstuNum。 SELECT StuNum=s_number FROM deletedPRINT 开始查找并删除t_score表中的相关记录
15、DELETE FROM t_score WHERE s_number=StuNumPRINT 删除了t_score表中的学好为 +RTRIM(StuNum)+ 的记录。 触发Stu_Delete USE student GO DELETE FROM t_student WHERE s_number=9952123 DELETE FROM t_student WHERE s_number=9952124 GO (3) INSTEAD OF触发器 USE student GO IF EXISTS(SELECT name FROM sysobjects WHERE name=NotAllowDeleteAND type=TR) DROP TRIGGER NotAllowDelete ON t_sourse INSTEAD OF DELETE AS PRINT INSTEAD OF 触发器开始执行PRINT 本表中的数据不允许被删除!不能执行删除操作 GO 触发NotAllowDelete USE student GO DELETE FROM t_course WHERE c_number=