《SQL触发器语法参考》由会员分享,可在线阅读,更多相关《SQL触发器语法参考(11页珍藏版)》请在金锄头文库上搜索。
1、SQL触发器语法参考CreateTRIGGER trigger_nameON ( 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_bitmas
2、k .n sql_statement .n 参数trigger_name是触发器的名称。触发器名称必须符合标识符规则,并且在数据库中必须唯一。可以选择是否指定触发器 所有者名称。Table | view是在其上执行触发器的表或视图,有时称为触发器表或触发器视图。可以选择是否指定表或视图的所有者 名称。WITH ENCRYPTION加密syscomments表中包含Create TRIGGER语句文本的条目。使用 WITH ENCRYPTION可防止将 触发器作为SQL Server复制的一部分发布。AFTER指定触发器只有在触发SQL语句中指定的所有操作都已成功执行后才激发。所有的引用级联操作
3、和约束 检查也必须成功完成后,才能执行此触发器。如果仅指定FOR关键字,则AFTER是默认设置。不能在视图上定义AFTER触发器。INSTEAD OF指定执行触发器而不是执行触发SQL语句,从而替代触发语句的操作。在表或视图上,每个Insert、Update或Delete语句最多可以定义一个INSTEAD OF触发器。然而,可 以在每个具有INSTEAD OF触发器的视图上定义视图。INSTEAD OF触发器不能在 WITH CHECK OPTION的可更新视图上定义。如果向指定了 WITH CHE CK OPTION选项的可更新视图添加INSTEAD OF触发器,SQL Server将产生一
4、个错误。用户必须用 Alter VIEW删除该选项后才能定义INSTEADOF触发器。( Delete , Insert ,Update 是指定在表或视图上执行哪些数据修改语句时将激活触发器的关键字。必须至少指定一个选项。在触发器 定义中允许使用以任意顺序组合的这些关键字。如果指定的选项多于一个,需用逗号分隔这些选项。对于INSTEAD OF触发器,不允许在具有ON Delete级联操作引用关系的表上使用Delete选项。同 样,也不允许在具有ONUpdate级联操作引用关系的表上使用Update选项。WITH APPEND指定应该添加现有类型的其它触发器。只有当兼容级别是65或更低时,才需要
5、使用该可选子句。如果兼 容级别是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表示当复制进程更改触发器所涉及的
6、表时,不应执行该触发器。AS是触发器要执行的操作。sql_statement是触发器的条件和操作。触发器条件指定其它准则,以确定Delete. Insert或Update语句是否导致执行 触发器操作。当尝试Delete、Insert或Update操作时,Transact-SQL语句中指定的触发器操作将生效。触发器可以包含任意数量和种类的Transact-SQL语句。触发器旨在根据数据修改语句检查或更改数据; 它不应将数据返回给用户。触发器中的Transact-SQL语句常常包含控制流语言。Create TRIGGER语句 中使用几个特殊的表:deleted和inserted是逻辑(概念)表。这
7、些表在结构上类似于定义触发器的表(也就是在其中尝试用户 操作的表);这些表用于保存用户操作可能更改的行的旧值或新值。例如,若要检索deleted表中的所有 值,请使用:Select * FROM deleted如果兼容级别等于70,那么在Delete. Insert或Update触发器中,SQL Server将不允许引用insert ed 和 deleted 表中的 text、ntext 或 image 歹。不能访问 inserted 和 deleted 表中的 text、ntext 和 i mage值。若要在Insert或Update触发器中检索新值,请将inserted表与原始更新表联接。
8、当兼容级 别是65或更低时,对inserted或deleted表中允许空值的text、ntext或image列,将返回空值;如 果这些列不可为空,则返回零长度字符串。当兼容级别是80或更高时,SQL Server允许在表或视图上通过INSTEADOF触发器更新text、ntext 或 image 列。是表示触发器中可以包含多条Transact-SQL语句的占位符。对于IF Update (column)语句,可以通过 重复Update(column)子句包含多列。IF Update (column)测试在指定的列上进行的Insert或Update操作,不能用于Delete操作。可以指定多列。因
9、为在ON子 句中指定了表名,所以在IF Update子句中的列名前不要包含表名。若要测试在多个列上进行的Insert 或Update操作,请在第一个操作后指定单独的Update(column)子句。在Insert操作中IF Update将 返回TRUE值,因为这些列插入了显式值或隐性(NULL)值。说明IF Update (column)子句的功能等同于IF、IF.ELSE或 WHILE语句,并且可以使用BEGIN.END语句块。有关更多信息,请参见控制流语言。可以在触发器主体中的任意位置使用Update (column) ocolumn是要测试Insert或Update操作的列名。该列可以是
10、SQL Server支持的任何数据类型。但是,计算列 不能用于该环境中。有关更多信息,请参见数据类型。IF (COLUMNS_UpdateD()测试是否插入或更新了提及的列,仅用于Insert或Update触发器中。COLUMNS_UpdateD返回varbi nary位模式,表示插入或更新了表中的哪些列。COLUMNS_UpdateD函数以从左到右的顺序返回位,最左边的为最不重要的位。最左边的位表示表中的 第一列;向右的下一位表示第二列,依此类推。如果在表上创建的触发器包含8列以上,则COLUMNS_ UpdateD返回多个字节,最左边的为最不重要的字节。在Insert操作中COLUMNS_
11、UpdateD将对所有 列返回TRUE值,因为这些列插入了显式值或隐性(NULL)值。可以在触发器主体中的任意位置使用COLUMNS_UpdateD。bitwise_operator是用于比较运算的位运算符。updated_bitmask是整型位掩码,表示实际更新或插入的列。例如,表t1包含列C1、C2、C3、C4和C5。假定表t1上 有Update触发器,若要检查列C2、C3和C4是否都有更新,指定值14;若要检查是否只有列C2有 更新,指定值 2ocomparison_operator是比较运算符。使用等号(=)检查updated_bitmask中指定的所有列是否都实际进行了更新。使用大于
12、号 ()检查updated_bitmask中指定的任一列或某些列是否已更新。column_bitmask是要检查的列的整型位掩码,用来检查是否已更新或插入了这些列。注释触发器常常用于强制业务规则和数据完整性。SQL Server通过表创建语句(Alter TABLE和Create TA BLE)提供声明引用完整性(DRI);但是DRI不提供数据库间的引用完整性。若要强制引用完整性(有关 表的主键和外键之间关系的规则),请使用主键和外键约束(AlterTABLE和Create TABLE的PRIMA RY KEY和FOREIGN KEY关键字)。如果触发器表存在约束,则在INSTEAD OF触发
13、器执行之后和 AFTER触发器执行之前检查这些约束。如果违反了约束,则回滚INSTEAD OF触发器操作且不执行(激 发)AFTER触发器。可用sp_settriggerorder指定表上第一个和最后一个执行的AFTER触发器。在表上只能为每个Insert、 Update和Delete操作指定一个第一个执行和一个最后一个执行的AFTER触发器。如果同一表上还有其 它AFTER触发器,则这些触发器将以随机顺序执行。如果Alter TRIGGER语句更改了第一个或最后一个触发器,则将除去已修改触发器上设置的第一个或最 后一个特性,而且必须用sp_settriggerorder重置排序值。只有当触发
14、SQL语句(包括所有与更新或删除的对象关联的引用级联操作和约束检查)成功执行后,AF TER触发器才会执行。AFTER触发器检查触发语句的运行效果,以及所有由触发语句引起的Update和 Delete引用级联操作的效果。触发器限制Create TRIGGER必须是批处理中的第一条语句,并且只能应用到一个表中。触发器只能在当前的数据库中创建,不过触发器可以引用当前数据库的外部对象。如果指定触发器所有者名称以限定触发器,请以相同的方式限定表名。在同一条Create TRIGGER语句中,可以为多种用户操作(如Insert和Update)定义相同的触发器操 作。如果一个表的外键在Delete/Upd
15、ate操作上定义了级联,则不能在该表上定义INSTEAD OF Delete/Upd ate触发器。在触发器内可以指定任意的SET语句。所选择的SET选项在触发器执行期间有效,并在触发器执行完后 恢复到以前的设置。与使用存储过程一样,当触发器激发时,将向调用应用程序返回结果。若要避免由于触发器激发而向应用 程序返回结果,请不要包含返回结果的Select语句,也不要包含在触发器中进行变量赋值的语句。包含向 用户返回结果的Select语句或进行变量赋值的语句的触发器需要特殊处理;这些返回的结果必须写入允许 修改触发器表的每个应用程序中。如果必须在触发器中进行变量赋值,则应该在触发器的开头使用SET NOCOUNT语句以避免返回任何结果集。Delete触发器不能捕获TRUNCATE TABLE语句。尽管TRUNCATE TABLE语句实际上是没有 Wher e子句的Delete (它删除所有行),但它是无日志记录的,因而不能执行触发器。因为TRUNCATE TAB LE语句的权限默认授予表所有者且不可转让,所以只有表所有者才需要考虑无意中用TRUNCATE TABL E语句规避Delete触发器的问题。无论有日志记录还是无日志记录,WRITETEXT语句都不激活触发器。触发器中不允许以下Transact-SQ