第8章存储过程和触发器详解.ppt
文本预览下载声明
[{ IF UPDATE(column) [{AND | OR } UPDATE(column)] […n] | IF (COLUMNS_ UPDATED() {bitwise_operator} updated_bitmask) { comparison_operator } column_bitmask […n] } ] sql_statement […n] } } 2.参数说明 参数trigger_name用于指定触发器名。触发器名必须符合标识符规则,并且在数据库中必须惟一,可以包含触发器所有者名。 table l view是触发器表或触发器视图,即在其上执行触发器的表或视图。有时,可以包含表或视图的所有者名。 关键字WITH ENCRYPTION可防止将触发器作为SQL Server复制的一部分发布。 AFTER关键字用于说明触发器在指定操作都成功执行后触发,AFTER是默认设置,不能在视图上定义AFTER触发器。 INSTEAD OF指定用触发器中的操作代替触发语句的操作,在表或视图上,每个INSERT、UPDATE或DELETE语句最多可以定义一个INSTEAD OF触发器。如果触发器表存在约束,则在INSTEAD OF触发器执行之后和AFTER触发器执行之前检查这些约束。如果违反了约束,则回滚INSTEAD OF触发器操作且不执行AFTER触发器,INSTEAD OF触发器不能在WITH CHECK OPTION可更新视图上定义。 关键字DELETE、 INSERT和UPDATE用于指定在表或视图上执行这一操作时将激活相应的触发器,必须指定一项或多项,项与项之间用逗号分隔。 关键字选项NOT FOR REPLICATION指该触发器对于复制进程无效。 IF UPDATE(column)子句用于测试在指定的列上进行的INSERT或UPDATE操作,不能用于DELETE操作;UPDATE(column)中的column为表或者视图中的列名称,说明这一列的数据是否被INSERT或者UPDATE操作修改过。如果修改过,则返回TRUE,否则返回FALSE。 IF(COLUMNS_UPDATED())子句用于测试是否插入或更新了指定的列。返回的二进制位数据,表示插入或更新了表中的哪些列,若对应位为0,表示没有插入或更新;若对应位为1,表示对该列进行了插入或更新。关于表文件的列与二进制位的对应关系为:如果表的列从左向右分别为C0,C1,C2,C3,C4…则分别对应二进制位的第0位、第1位、第2位、第3位、第4位……依此类推。 如果在表上创建的触发器包含8列以上,则COLUMNS_UPDATED()返回多个字节。 在INSERT操作中,COLUMNS_UPDATED将对所有列返回TRUE值, IF(COLUMNS_ UPDATED())仅用于INSERT或UPDATE触发器。 bitwise_opemtor为用于比较运算的位运算符。updated_bitmask为整型的位屏蔽码,假定该表上有UPDATE触发器,若要检查列C1、C2、C4是否都有更新,可指定updated_bitmask的值即22);若要检查是否只有列C1有更新,可指定updated_bitmask的值即2)。 comparison_operator为比较运算符。使用等号(=)检查updated_bitmask中指定的所有列是否都实际进行了更新。使用大于号()检查update_bitmask中指定的任一列或某些列是否已更新。 column_bitmask为列屏蔽码,用来检查是否已更新或插入了对应列。 参数sql_statement为触发器的T-SQL语句,当执行DELETE、INSERT或UPDATE操作时,对应的触发器操作将生效。 n表示触发器中可以包含多条T-SQL语句。 USE Student GO /*如果表B1存在,则删除*/ IF EXISTS (SELECT name FROM sysobjects WHERE name=B1) DROP TABLE B1 GO CREATE TABLE B1 ( student_number int, student_name char(30) ) GO /*如果触发器Query1_B1存在,则删除*/ IF EXISTS (SELECT name FROM sysobjects WHERE name=Query1_B1 AND type=TR) DROP TRIGGER Query1_B1 GO /*创建触发器Q
显示全部