更改原来由 CREATE TRIGGER 语句创建的触发器定义有关 ALTER TRIGGER 语句所用参数的更多信息请参见 CREATE TRIGGER 语法 ALTER TRIGGER trigger_name ON ( table | view ) [ WITH ENCRYPTION ] { { ( FOR | AFTER | INSTEAD OF ) { [ DELETE ] [ ] [ INSERT ] [ ] [ UPDATE ] } [ NOT FOR REPLICATION ] AS sql_statement [ n ] } | { ( FOR | AFTER | INSTEAD OF ) { [ INSERT ] [ ] [ UPDATE ] } [ NOT FOR REPLICATION ] AS { IF UPDATE ( column ) [ { AND | OR } UPDATE ( column ) ] [ n ] | IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask ) { comparison_operator } column_bitmask [ n ] } sql_statement [ n ] } } 参数 trigger_name 是要更改的现有触发器 table | view 是触发器在其上执行的表或视图 WITH ENCRYPTION 加密 syscomments 表中包含 ALTER TRIGGER 语句文本的条目使用 WITH ENCRYPTION 可防止将触发器作为 SQL Server 复制的一部分发布 说明 如果原来的触发器定义是用 WITH ENCRYPTION 或 RECOMPILE 创建的那么只有在 ALTER TRIGGER 中也包含这些选项时这些选项才有效 AFTER 指定触发器只有在触发它的 SQL 语句执行成功后才触发所有的引用级联操作和约束检查也必须成功完成后才能执行此触发器 如果仅指定了 FOR 关键字那么 AFTER 是默认设置 AFTER 触发器只能定义在表上 INSTEAD OF 指定执行触发器而不是触发 SQL 语句从而替代触发语句的操作 在表或视图上每个 INSERTUPDATE 或 DELETE 语句最多可以定义一个 INSTEAD OF 触发器然而可以在每个具有 INSTEAD OF 触发器的视图上定义视图 INSTEAD OF 触发器不允许定义在用 WITH CHECK OPTION 创建的视图上如果向指定了 WITH CHECK OPTION 选项的视图添加 INSTEAD OF 触发器SQL Server 将引发一个错误用户必须用 ALTER VIEW 删除该选项后才能定义 INSTEAD OF 触发器 { [DELETE] [] [INSERT] [] [UPDATE] } | { [INSERT] [] [UPDATE]} 是指定在表或视图上执行哪些数据修改语句时将激活触发器的关键字必须至少指定一个选项在触发器定义中允许使用以任意顺序组合的这些关键字如果指定的选项多于一个需用逗号分隔这些选项 对于 INSTEAD OF 触发器不允许在具有 ON DELETE 级联操作引用关系的表上使用 DELETE 选项同样也不允许在具有 ON UPDATE 级联操作引用关系的表上使用 UPDATE 选项有关更多信息请参见 ALTER TABLE NOT FOR REPLICATION 表示当复制登录(如 sqlrepl)更改触发器所涉及的表时不应执行该触发器 AS 是触发器要执行的操作 sql_statement 是触发器的条件和操作 n 是表示触发器中可以包含多条 TransactSQL 语句的占位符 IF UPDATE (column) 测试在指定的列上进行的 INSERT 或 UPDATE 操作不能用于 DELETE 操作 可以在触发器主体中的任意位置使用 UPDATE(column) {AND | OR} 指定要测试 INSERT 或 UPDATE 操作的另一个列 column 是要测试 INSERT 或 UPDATE 操作的列名 IF (COLUMNS_UPDATED()) 判断提及的一列或多列是插入还是更新仅用于 INTSERT 或 UPDATE 触发器中COLUMNS_UPDATED 返回 varbinary 位模式该位模式表示表的哪些列进行了插入操作哪些列进行了更新操作 可以在触发器主体中的任意位置使用 COLUMNS_UPDATED bitwise_operator 是用于比较运算的位运算符 updated_bitmask 是整型位掩码表示实际更新或插入的列例如表 t 包含列 CCCC 和 C假定表 t 上有 UPDATE 触发器若要检查列 CC 和 C 是否都有更新指定值 若要检查是否只有列 C 有更新指定值 comparison_operator 是比较运算符使用等号 (=) 检查 updated_bitmask 中指定的所有列是否都实际进行了更新使用大于号 (>) 来检查 updated_bitmask 中指定的列是否有进行过更新的或者没有全部进行更新 column_bitmask 是要检查的列的整型位掩码 说明 由于 Microsoft 不支持在系统表上添加用户定义触发器所以建议不要在系统表上创建用户定义触发器 通过表和视图上的 INSTEAD OF 触发器ALTER TRIGGER 支持可手工更新的视图Microsoft® SQL Server; 以相同的方式对所有类型的触发器(AFTERINSTEADOF)应用 ALTER TRIGGER 可用 sp_settriggerorder 指定表上第一个和最后一个执行的 AFTER 触发器在表上只能指定一个第一个执行及一个最后一个执行的 AFTER 触发器如果该表上还有其它 AFTER 触发器那么这些触发器将以未定义的顺序执行 如果 ALTER TRIGGER 语句更改了第一个或最后一个触发器则将除去已修改触发器上设置的第一个或最后一个特性而且必须用 sp_settriggerorder 重置排序值 只有当激发触发器的 SQL 语句(包括所有与被更新或删除对象有关的引用级联操作和约束检查)成功执行后AFTER 触发器才会执行AFTER 触发器操作要检查激发触发器的语句的运行结果(也包括所有由激发语句引起的 UPDATE 和 DELETE 引用级联操作) 如果一个子表或引用表上的 DELETE 操作是由于父表的 CASCADE DELETE 操作所引起的并且子表上定义了 DELETE 的 INSTEAD OF 触发器那么将忽略该触发器并执行 DELETE 操作 权限 ALTER TRIGGER 的权限默认地授予 db_owner 和 db_ddladmin 固定数据库角色的成员以及表所有者这些权限是不可传递的 示例 下例首先创建一个触发器当用户在表 roysched 中添加或更改数据时该触发器向客户端打印一条用户定义消息然后使用 ALTER TRIGGER 语句使该触发器仅对 INSERT 活动有效该触发器有助于提醒向表中插入行或更新行的用户及时通知书的作者和出版商 USE pubs GO CREATE TRIGGER royalty_reminder ON roysched WITH ENCRYPTION FOR INSERT UPDATE AS RAISERROR ( ) Now alter the trigger USE pubs GO ALTER TRIGGER royalty_reminder ON roysched FOR INSERT AS RAISERROR ( ) 消息 是 sysmessages 中的用户定义消息 |