SQL触发器语法参考

发表于:2010-8-09 14:59

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:david_5200    来源:51Testing软件测试网采编

分享:

  bitwise_operator

  是用于比较运算的位运算符。

  updated_bitmask

  是整型位掩码,表示实际更新或插入的列。例如,表 t1 包含列C1、C2、C3、C4 和 C5。假定表 t1 上有 Update 触发器,若要检查列C2、C3 和 C4 是否都有更新,指定值 14;若要检查是否只有列 C2有更新,指定值 2。

  comparison_operator

  是比较运算符。使用等号(=)检查updated_bitmask中指定的所有列是否都实际进行了更新。使用大于号(>)检查updated_bitmask 中指定的任一列或某些列是否已更新。

  column_bitmask

  是要检查的列的整型位掩码,用来检查是否已更新或插入了这些列。

  注释

  触发器常常用于强制业务规则和数据完整性。SQL Server通过表创建语句(Alter TABLE 和 Create TABLE)提供声明引用完整性 (DRI);但是 DRI不提供数据库间的引用完整性。若要强制引用完整性(有关表的主键和外键之间关系的规则),请使用主键和外键约束(AlterTABLE 和 Create TABLE 的 PRIMARY KEY 和 FOREIGN KEY关键字)。如果触发器表存在约束,则在 INSTEAD OF 触发器执行之后和AFTER 触发器执行之前检查这些约束。如果违反了约束,则回滚 INSTEAD OF触发器操作且不执行(激发)AFTER 触发器。

  可用 sp_settriggerorder 指定表上第一个和最后一个执行的 AFTER触发器。在表上只能为每个 Insert、Update 和 Delete操作指定一个第一个执行和一个最后一个执行的 AFTER触发器。如果同一表上还有其它 AFTER触发器,则这些触发器将以随机顺序执行。

  如果 Alter TRIGGER语句更改了第一个或最后一个触发器,则将除去已修改触发器上设置的第一个或最后一个特性,而且必须用 sp_settriggerorder 重置排序值。

  只有当触发SQL语句(包括所有与更新或删除的对象关联的引用级联操作和约束检查)成功执行后,AFTER触发器才会执行。AFTER触发器检查触发语句的运行效果,以及所有由触发语句引起的 Update 和Delete 引用级联操作的效果。

  触发器限制

  Create TRIGGER必须是批处理中的第一条语句,并且只能应用到一个表中。触发器只能在当前的数据库中创建,不过触发器可以引用当前数据库的外部对象。如果指定触发器所有者名称以限定触发器,请以相同的方式限定表名。

  在同一条 Create TRIGGER 语句中,可以为多种用户操作(如 Insert 和Update)定义相同的触发器操作。如果一个表的外键在 Delete/Update操作上定义了级联,则不能在该表上定义 INSTEAD OF Delete/Update触发器。

  在触发器内可以指定任意的 SET 语句。所选择的 SET选项在触发器执行期间有效,并在触发器执行完后恢复到以前的设置。与使用存储过程一样,当触发器激发时,将向调用应用程序返回结果。若要避免由于触发器激发而向应用程序返回结果,请不要包含返回结果的Select语句,也不要包含在触发器中进行变量赋值的语句。包含向用户返回结果的Select语句或进行变量赋值的语句的触发器需要特殊处理;这些返回的结果必须写入允许修改触发器表的每个应用程序中。如果必须在触发器中进行变量赋值,则应该在触发器的开头使用SET NOCOUNT 语句以避免返回任何结果集。

  Delete 触发器不能捕获 TRUNCATE TABLE 语句。尽管 TRUNCATE TABLE语句实际上是没有 Where 子句的Delete(它删除所有行),但它是无日志记录的,因而不能执行触发器。因为TRUNCATE TABLE语句的权限默认授予表所有者且不可转让,所以只有表所有者才需要考虑无意中用TRUNCATE TABLE 语句规避 Delete 触发器的问题。

  无论有日志记录还是无日志记录,WRITETEXT 语句都不激活触发器。

  触发器中不允许以下Transact-SQL语句:

   Alter DATABASE Create DATABASE DISK INIT
   DISK RESIZE Drop DATABASE LOAD DATABASE
   LOAD LOG RECONFIGURE RESTORE DATABASE
   RESTORELOG 

  说明由于 SQL Server不支持系统表中的用户定义触发器,因此建议不要在系统表中创建用户定义触发器。

  多个触发器

  SQL Server 允许为每个数据修改事件(Delete、Insert 或Update)创建多个触发器。例如,如果对已有 Update 触发器的表执行Create TRIGGER FORUpdate,则将创建另一个更新触发器。在早期版本中,在每个表上,每个数据修改事件(Insert、Update或 Delete)只允许有一个触发器。

  说明如果触发器名称不同,则 CreateTRIGGER(兼容级别为70)的默认行为是在现有的触发器中添加其它触发器。如果触发器名称相同,则SQL Server 返回一条错误信息。但是,如果兼容级别等于或小于65,则使用 Create TRIGGER语句创建的新触发器将替换同一类型的任何现有触发器,即使触发器名称不同。有关更多信息,请参见sp_dbcmptlevel。

63/6<123456>
重磅发布,2022软件测试行业现状调查报告~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2023
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号