SQL触发器语法参考
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
SQL触发器语法参考
CreateTRIGGER trigger_name
ON { table | view }
[ WITH ENCRYPTION ]
{
{ { FOR |AFTER | INSTEAD OF } { [ Insert ] [ , ] [ Update ] }
[ WITH APPEND ]
[ 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 表中包含Create TRIGGER语句文本的条目。使用WITH ENCRYP TION 可防止将触发器作为SQL Server复制的一部分发布。
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 删除该选项后才能定义INSTEADOF 触发器。
{ [Delete] [,] [Insert] [,][Update] }
是指定在表或视图上执行哪些数据修改语句时将激活触发器的关键字。必须至少指定一个选项。在触发器定义中允许使用以任意顺序组合的这些关键字。如果指定的选项多于一个,需用逗号分隔这些选项。
对于INSTEAD OF 触发器,不允许在具有ON Delete级联操作引用关系的表上使用De lete 选项。同样,也不允许在具有ONUpdate 级联操作引用关系的表上使用Update 选项。
WITH APPEND
指定应该添加现有类型的其它触发器。只有当兼容级别是65或更低时,才需要使用该可选子句。如果兼容级别是70或更高,则不必使用WITH APPEND子句添加现有类型的其它触发器(这是兼容级别设置为70 或更高的CreateTRIGGER 的默认行为)。有关更多信息,请参见sp_dbcmptlevel。
WITH APPEND 不能与INSTEAD OF触发器一起使用,或者,如果显式声明AFTER触发器,也不能使用该子句。只有当出于向后兼容而指定FOR 时(没有INSTEAD OF 或AFTER),才能使用WITH APPEND。以后的版本将不支持WITH APPEND 和FOR(将被解释为AFTER)。
NOT FOR REPLICATION
表示当复制进程更改触发器所涉及的表时,不应执行该触发器。
AS
是触发器要执行的操作。
sql_statement
是触发器的条件和操作。触发器条件指定其它准则,以确定Delete、Insert 或Update 语句是否导致执行触发器操作。
当尝试Delete、Insert 或Update操作时,Transact-SQL语句中指定的触发器操作将生效。
触发器可以包含任意数量和种类的Transact-SQL语句。触发器旨在根据数据修改语句检查或更改数据;它不应将数据返回给用户。触发器中的Transact-SQL 语句常常包含控制流语言。Create TRIGGER语句中使用几个特殊的表:
deleted 和inserted是逻辑(概念)表。这些表在结构上类似于定义触发器的表(也就是在其中尝试用户操作的表);这些表用于保存用户操作可能更改的行的旧值或新值。例如,若要检索deleted 表中的所有值,请使用:
Select *
FROM deleted
如果兼容级别等于70,那么在Delete、Insert 或Update 触发器中,SQL Server 将不允许引用inserted 和deleted 表中的text、ntext 或image 列。不能访问inserted 和del eted 表中的text、ntext 和image 值。若要在Insert 或Update触发器中检索新值,请将inserted 表与原始更新表联接。当兼容级别是65或更低时,对inserted 或deleted 表中允许空值的text、ntext 或image列,将返回空值;如果这些列不可为空,则返回零长度字符串。
当兼容级别是80 或更高时,SQL Server 允许在表或视图上通过INSTEADOF 触发器更新text、ntext 或image 列。
n
是表示触发器中可以包含多条Transact-SQL语句的占位符。对于IF Update (column)
语句,可以通过重复Update(column) 子句包含多列。
IF Update (column)
测试在指定的列上进行的Insert 或Update操作,不能用于Delete 操作。可以指定多列。因为在ON子句中指定了表名,所以在IF Update子句中的列名前不要包含表名。若要测试在多个列上进行的Insert 或Update 操作,请在第一个操作后指定单独的Update(colu mn) 子句。在Insert 操作中IF Update 将返回TRUE值,因为这些列插入了显式值或隐性(NULL) 值。
说明IF Update (column) 子句的功能等同于IF、IF...ELSE 或WHILE 语句,并且可以使用BEGIN...END语句块。有关更多信息,请参见控制流语言。
可以在触发器主体中的任意位置使用Update (column)。