触发器是一种特殊类型的存储过程,不由用户直接调用。创建触发器时会对其进行定义,以便在对特定表或列作特定类型的数据修改时执行。
  CREATE PROCEDURE 或 CREATE TRIGGER 语句不能跨越批处理。即存储过程或触发器始终只能在一个批处理中创建并编译到一个执行计划中。
  用触发器还可以强制执行业务规则
  Microsoft® SQL Server™ 2000 提供了两种主要机制来强制业务规则和数据完整性:约束和触发器。触发器是一种特殊类型的存储过程,它在指定的表中的数据发生变化时自动生效。唤醒调用触发器以响应 INSERT、UPDATE 或 DELETE 语句。触发器可以查询其它表,并可以包含复杂的 Transact-SQL 语句。将触发器和触发它的语句作为可在触发器内回滚的单个事务对待。如果检测到严重错误(例如,磁盘空间不足),则整个事务即自动回滚。
  触发器的优点如下:
  触发器可通过数据库中的相关表实现级联更改;不过,通过级联引用完整性约束可以更有效地执行这些更改。
  触发器可以强制比用 CHECK 约束定义的约束更为复杂的约束。
  与 CHECK 约束不同,触发器可以引用其它表中的列。例如,触发器可以使用另一个表中的 SELECT 比较插入或更新的数据,以及执行其它操作,如修改数据或显示用户定义错误信息。
  触发器也可以评估数据修改前后的表状态,并根据其差异采取对策。
  一个表中的多个同类触发器(INSERT、UPDATE 或 DELETE)允许采取多个不同的对策以响应同一个修改语句。
  比较触发器与约束
  约束和触发器在特殊情况下各有优势。触发器的主要好处在于它们可以包含使用 Transact-SQL 代码的复杂处理逻辑。因此,触发器可以支持约束的所有功能;但它在所给出的功能上并不总是最好的方法。
  实体完整性总应在最低级别上通过索引进行强制,这些索引或是 PRIMARY KEY 和 UNIQUE 约束的一部分,或是在约束之外独立创建的。假设功能可以满足应用程序的功能需求,域完整性应通过 CHECK 约束进行强制,而引用完整性 (RI) 则应通过 FOREIGN KEY 约束进行强制。
  在约束所支持的功能无法满足应用程序的功能要求时,触发器就极为有用。例如:
  除非 REFERENCES 子句定义了级联引用操作,否则 FOREIGN KEY 约束只能以与另一列中的值完全匹配的值来验证列值。
  CHECK 约束只能根据逻辑表达式或同一表中的另一列来验证列值。如果应用程序要求根据另一个表中的列验证列值,则必须使用触发器。
  约束只能通过标准的系统错误信息传递错误信息。如果应用程序要求使用(或能从中获益)自定义信息和较为复杂的错误处理,则必须使用触发器。
  触发器可通过数据库中的相关表实现级联更改;不过,通过级联引用完整性约束可以更有效地执行这些更改。
  触发器可以禁止或回滚违反引用完整性的更改,从而取消所尝试的数据修改。当更改外键且新值与主键不匹配时,此类触发器就可能发生作用。例如,可以在 titleauthor.title_id 上创建一个插入触发器,使它在新值与 titles.title_id 中的某个值不匹配时回滚一个插入。不过,通常使用 FOREIGN KEY 来达到这个目的。
  如果触发器表上存在约束,则在 INSTEAD OF 触发器执行后但在 AFTER 触发器执行前检查这些约束。如果约束破坏,则回滚 INSTEAD OF 触发器操作并且不执行 AFTER 触发器。
  SQL触发器语法
  语法
  CREATE TRIGGER trigger_name
  ON { table | view }
  [ WITH ENCRYPTION ]
  {
  { { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ DELETE ] [ UPDATE ] }
  [ WITH APPEND ]
  [ NOT FOR REPLICATION ]
  AS
  [ { IF UPDATE ( column )
  [ { AND | OR } UPDATE ( column ) ]
  [ ...n ]
  | IF ( COLUMNS_UPDATED ( ) updated_bitmask )
  column_bitmask [ ...n ]
  } ]
  sql_statement [ ...n ]
  }
  }
  参数
  trigger_name
  是触发器的名称。触发器名称必须符合标识符规则,并且在数据库中必须唯一。可以选择是否指定触发器所有者名称。
  Table | view
  是在其上执行触发器的表或视图,有时称为触发器表或触发器视图。可以选择是否指定表或视图的所有者名称。
  WITH ENCRYPTION
  加密 syscomments 表中包含 CREATE TRIGGER 语句文本的条目。使用 WITH ENCRYPTION 可防止将触发器作为 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 删除该选项后才能定义 INSTEAD OF 触发器。
  { [DELETE] [,] [INSERT] [,] [UPDATE] }
  是指定在表或视图上执行哪些数据修改语句时将激活触发器的关键字。必须至少指定一个选项。在触发器定义中允许使用以任意顺序组合的这些关键字。如果指定的选项多于一个,需用逗号分隔这些选项。
  对于 INSTEAD OF 触发器,不允许在具有 ON DELETE 级联操作引用关系的表上使用 DELETE 选项。同样,也不允许在具有 ON UPDATE 级联操作引用关系的表上使用 UPDATE 选项。
  WITH APPEND
  指定应该添加现有类型的其它触发器。只有当兼容级别是 65 或更低时,才需要使用该可选子句。如果兼容级别是 70 或更高,则不必使用 WITH APPEND 子句添加现有类型的其它触发器(这是兼容级别设置为 70 或更高的 CREATE TRIGGER 的默认行为)。有关更多信息,请参见 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 和 deleted 表中的 text、ntext 和 image 值。若要在 INSERT 或 UPDATE 触发器中检索新值,请将 inserted 表与原始更新表联接。当兼容级别是 65 或更低时,对 inserted 或 deleted 表中允许空值的text、ntext 或 image 列,将返回空值;如果这些列不可为空,则返回零长度字符串。
  当兼容级别是 80 或更高时,SQL Server 允许在表或视图上通过 INSTEAD OF 触发器更新 text、ntext 或 image 列。
  n
  是表示触发器中可以包含多条 Transact-SQL 语句的占位符。对于 IF UPDATE (column) 语句,可以通过重复 UPDATE (column) 子句包含多列。
  IF UPDATE (column)
  测试在指定的列上进行的 INSERT 或 UPDATE 操作,不能用于 DELETE 操作。可以指定多列。因为在 ON 子句中指定了表名,所以在 IF UPDATE 子句中的列名前不要包含表名。若要测试在多个列上进行的 INSERT 或 UPDATE 操作,请在第一个操作后指定单独的 UPDATE(column) 子句。在 INSERT 操作中 IF UPDATE 将返回 TRUE 值,因为这些列插入了显式值或隐性 (NULL) 值。
  说明 IF UPDATE (column) 子句的功能等同于 IF、IF...ELSE 或 WHILE 语句,并且可以使用 BEGIN...END 语句块。有关更多信息,请参见控制流语言。
  可以在触发器主体中的任意位置使用 UPDATE (column)。
  column
  是要测试 INSERT 或 UPDATE 操作的列名。该列可以是 SQL Server 支持的任何数据类型。但是,计算列不能用于该环境中。有关更多信息,请参见数据类型。
  IF (COLUMNS_UPDATED())
  测试是否插入或更新了提及的列,仅用于 INSERT 或 UPDATE 触发器中。COLUMNS_UPDATED 返回 varbinary 位模式,表示插入或更新了表中的哪些列。
  COLUMNS_UPDATED 函数以从左到右的顺序返回位,最左边的为最不重要的位。最左边的位表示表中的第一列;向右的下一位表示第二列,依此类推。如果在表上创建的触发器包含 8 列以上,则 COLUMNS_UPDATED 返回多个字节,最左边的为最不重要的字节。在 INSERT 操作中 COLUMNS_UPDATED 将对所有列返回 TRUE 值,因为这些列插入了显式值或隐性 (NULL) 值。
  可以在触发器主体中的任意位置使用 COLUMNS_UPDATED。
  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 不提供数据库间的引用完整性。若要强制引用完整性(有关表的主键和外键之间关系的规则),请使用主键和外键约束(ALTER TABLE 和 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 引用级联操作的效果。

转载于:https://www.cnblogs.com/xianqingzh/archive/2009/04/30/1447148.html

转帖(http://hi.baidu.com/johnehuang/blog/item/e1e96782a4b04e97f703a6dc.html)相关推荐

  1. http://hi.baidu.com/grayworm/blog/item/c76c4046307d380a6a63e56a.html

    http://hi.baidu.com/grayworm/blog/item/c76c4046307d380a6a63e56a.html

  2. javax.servlet.Filter详解(二) 转自:http://hi.baidu.com/jxnuywf/blog/item/f3834aee93e2fdf8b2fb95cc.html

    转自:http://hi.baidu.com/jxnuywf/blog/item/f3834aee93e2fdf8b2fb95cc.html 1.5禁用激活器servlet 在对资源应用过滤器时,可通 ...

  3. IIS+php无法上传图片(转载自http://hi.baidu.com/0wem/blog/item/d222db163c3c831e972b4306.html)...

    延续<Windows Server 2003中iis配置php>一文 服务器上使用Apache2+PHP正常运行,换成IIS+PHP,先后出现了php.ini的环境变量无法读取,php中验 ...

  4. http://hi.baidu.com/megachan/blog/item/61e1bb6cb7ab2de64316941b.html

    函数功能 求数组的平均数或者均值 使用方法 M = mean(A) 返回沿数组中不同维的元素的平均值. 如果A是一个向量,mean(A)返回A中元素的平均值. 如果A是一个矩阵,mean(A)将其中的 ...

  5. (Ajax)表单验证 函数包http://hi.baidu.com/zeronet/blog/item/e8809654e112431e3b293569.html

    2007年05月21日 星期一 19:37 /***************************************************************************** ...

  6. 会说话的猪 转自:http://hi.baidu.com/gg81/blog/item/91c088ef5b177114fdfa3c72.html

    会说话的猪 2007-08-27 19:10 <会说话的猪> 作者:莫尔多瓦·久尔吉著 晚上十一点半,费盖泰国营农场的饲养员盖莱盖什喂完最后一次猪食,在宽敞的九号猪圈里又来回走了一遍,看看 ...

  7. http://hi.baidu.com/tim_zhou0720/blog/item/0ca2d686973cf4830df4d223.html

    65.78.170.112:36081@HTTP;美国 66.228.46.201:3128@HTTP;美国 新泽西州Linode公司 72.64.146.135:3128@HTTP;美国 佛罗里达州 ...

  8. 微软Bug管理(转载网址 http://hi.baidu.com/shan108/blog/item/90680b1f55bfba66f624e488.html)

    一. 团队组织 1.常见问题TestAge 中国软件测试时代 lt8Q$W F 没有人愿意做测试TestAge 中国软件测试时代 k4M.z'c.c,n+j1n t 觉得养不起那么多测试人员TestA ...

  9. 会计学里借贷记账法的借方与贷方(http://hi.baidu.com/honeyxxd/blog/item/7a8c1ed71e5f23dea044df50.html)

    借贷记帐法是以"借"."贷"两个字做为记帐符号,记录会计要素增减变动情况的一种复式记帐法.所以这个"借"."贷"不能从字 ...

  10. 关于百度旧博客http://hi.baidu.com/forverlin1204/blog

    http://hi.baidu.com/forverlin1204/blog 便于各位访问

最新文章

  1. 用eclipse在windows下搭建cocos2d-x开发环境
  2. 商品的包装(外贸知识二)
  3. sougou ubuntu 优麒麟_优麒麟(Ubuntu Kylin)17.04 正式版及银河麒麟社区版发布
  4. 【编程】位(bit)、字节(byte)和字(word)的区别
  5. Spring AOP 实战运用
  6. 求最长回文串-从动态规划到马拉车之路(上)
  7. ajax获取json里的list,ajax获取json数据然后将其装载到jqgrid实现
  8. 常用 doc bat 命令总结
  9. 解决MySQL删除和插入数据很慢的问题
  10. java imagemagick 灰度,如何在imagemagick中转换灰度bmp
  11. Java入门基础知识
  12. 软件设计过程--概要设计详细设计
  13. 为什么C++开发不需要安装STL库
  14. python画一棵树的心理测试_画树测试:一棵树读你的人生
  15. XGBOOST与GBD区别笔记
  16. 计算机组成存储器实验心得,《计算机组成原理》存储器读写实验报告
  17. 生命科学计算机科学结合,生命科学与计算机科学的结合发展研究.docx
  18. 国风就是帅,会三板吗,看看新天吧
  19. Word文档段落的前后间距单位磅改为行,行改为磅方法演示
  20. Linux第二课 文件系统目录结构

热门文章

  1. 腾讯云阿里云vps nc: getnameinfo: Temporary failure in name resolution
  2. 快速加速计算机的方法,电脑慢的快速解决办法 四种方法电脑速度变快10倍
  3. 代码读智识  笔墨知人心 1
  4. 【原创】十年可以做什么?
  5. 阿里巴巴icon在vue项目中使用方法
  6. SpringBoot 开发案例之各种参数传递,以及前端代码和postman测试(完整版)
  7. 教你提取图片中文字的四种方法
  8. 《“笨办法” 学C语言(Learn C The Hard Way)》
  9. Java—斗地主的洗牌发牌系统(积小流成江海)
  10. 安卓工具类集合—— 1 时间、时间戳转换工具