更改原来由 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 语句 从而替代触发语句的操作
在表或视图上 每个 INSERT UPDATE 或 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
是表示触发器中可以包含多条 Transact SQL 语句的占位符
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 包含列 C C C C 和 C 假定表 t 上有 UPDATE 触发器 若要检查列 C C 和 C 是否都有更新 指定值 若要检查是否只有列 C 有更新 指定值
comparison_operator
是比较运算符 使用等号 (=) 检查 updated_bitmask 中指定的所有列是否都实际进行了更新 使用大于号 (>) 来检查 updated_bitmask 中指定的列是否有进行过更新的 或者没有全部进行更新
column_bitmask
是要检查的列的整型位掩码
说明 由于 Microsoft 不支持在系统表上添加用户定义触发器 所以建议不要在系统表上创建用户定义触发器
通过表和视图上的 INSTEAD OF 触发器 ALTER TRIGGER 支持可手工更新的视图 Microsoft® SQL Server&# ; 以相同的方式对所有类型的触发器(AFTER INSTEAD OF)应用 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 中的用户定义消息