了解SQL Server触发器及触发器中的事务.doc

  1. 1、本文档共13页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
了解SQL Server触发器及触发器中的事务

了解SQL Server触发器及触发器中的事务 ???? 首先, 说下我写篇文章的目的,我希望能把我对触发器的理解,分享出来与你一起学习。如果你有对触发器和事务的概念,有些了解,这篇文章,对你来说会是很简单,或能让你更进一步的了解触发器里面的一些故事,和触发器中事务个故事。在这边文章里面,我不会从触发器和事务的概念去讲述,而是从常见的两种触发器类型(DML触发器 DDL触发器)和After触发器 ? Instead Of 触发器的应用不同,开始说起它们,然后是说与事务有关的故事。? 在下面的内容,用到一些SQL Server 触发器和事务的一些术语,如果有些不明白的地方,可以查阅MSDN资料库,或SQL Server本地帮助文档: DML触发器(DML Triggers) DDL触发器(DDL Triggers) 事务模式(Transaction modes) 显式事务(Explicit Transactions) 自动提交事务(Autocommit Transactions) 隐式事务(Implicit Transactions) 批范围的事务(Batch-scoped Transactions) After触发器 Vs Instead Of触发器 ????? ????? After 触发器将在处理触发操作(Insert、Update 或 Delete)、Instead Of 触发器和约束之后激发。Instead Of是将在处理约束前激发,以替代触发操作。下面两张图描述了After触发器和Instead Of触发器的执行先后顺序。 ???? ?????? ? ???? 图1???????????????????????????????????????????????????????????????????????????? 图2 ???? 左边的图1,描述了After触发器执行顺序情况,我在这里通过一个简单的例子来说明After触发器的执行顺序,以便能加深对左图1 After触发器的理解。 先创建表Contact use tempdb Go if object_id(Contact) Is Not null Drop Table Contact Go Create Table Contact ( ID int Primary Key Identity(1,1), Name nvarchar(50), Sex nchar(2) Check(Sex In(NF,NM)) Default(M) ) Go 再创建After触发器tr_Contact use tempdb Go If Exists(Select 1 From sys.triggers Where name=tr_Contact) Drop Trigger tr_Contact Go Create Trigger tr_Contact On Contact After Insert As Select Name,Sex From Inserted /*显示Inserted表的内容,用来判断触发器执行的先后顺序*/ Go 然后Insert数据,判断After触发器的执行顺序 use tempdb Go Insert Into Contact (Name,Sex) Values (Bill,U) Go 这里,在没有运行Insert语句之前,我们可以判断,执行Insert过程会触发Check错误,因为字段Sex的值必须是”F” Or “M”,而这里将要插入的是”U”.好了,再来看运行Insert语句后的情况。 本例子,只看到引发Check约束冲突的错误,而无法看到Inserted表的数据,说明一点就是,引起Check约束之前,不会引发After触发器tr_Contact的操作。这就验证了图1的After触发器执行顺序情况。 ???? 好了,接下来,我们再测试Instead Of触发器 图2的情况;我使用上边建好的测试表Contact来举例。 先修改触发器tr_Contact内容, use tempdb Go If Exists(Select 1 From sys.triggers Where name=tr_Contact) Drop Trigger tr_Contact Go Create Trigger tr_Contact On Contact Instead Of Insert As print 触发器作代替执行操作 Insert Into Contact (Name,Sex) Select Name,Sex From Inserted /*代替触发器外面的Insert行为

文档评论(0)

xcs88858 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档