欢迎来到天天文库
浏览记录
ID:38704491
大小:722.50 KB
页数:13页
时间:2019-06-17
《了解SQL Server触发器及触发器中的事务》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、了解SQLServer触发器及触发器中的事务 首先,说下我写篇文章的目的,我希望能把我对触发器的理解,分享出来与你一起学习。如果你有对触发器和事务的概念,有些了解,这篇文章,对你来说会是很简单,或能让你更进一步的了解触发器里面的一些故事,和触发器中事务个故事。在这边文章里面,我不会从触发器和事务的概念去讲述,而是从常见的两种触发器类型(DML触发器&DDL触发器)和After触发器& InsteadOf触发器的应用不同,开始说起它们,然后是说与事务有关的故事。 在下面的内容,用到一些SQLServer触发器和事务
2、的一些术语,如果有些不明白的地方,可以查阅MSDN资料库,或SQLServer本地帮助文档:DML触发器(DMLTriggers)DDL触发器(DDLTriggers)事务模式(Transactionmodes)显式事务(ExplicitTransactions)自动提交事务(AutocommitTransactions)隐式事务(ImplicitTransactions)批范围的事务(Batch-scopedTransactions)After触发器VsInsteadOf触发器 After触发器将在
3、处理触发操作(Insert、Update或Delete)、InsteadOf触发器和约束之后激发。InsteadOf是将在处理约束前激发,以替代触发操作。下面两张图描述了After触发器和InsteadOf触发器的执行先后顺序。 图1 图2 左边的图1,描述了After触发器执行顺序情况,我在这里通过一个简单的例子来说明After触发器的
4、执行顺序,以便能加深对左图1After触发器的理解。先创建表ContactusetempdbGoifobject_id('Contact')IsNotnullDropTableContactGoCreateTableContact(IDintPrimaryKeyIdentity(1,1),Namenvarchar(50),Sexnchar(2)Check(SexIn(N'F',N'M'))Default('M'))Go再创建After触发器tr_ContactusetempdbGoIfExists(Select1Fro
5、msys.triggersWherename='tr_Contact')DropTriggertr_ContactGoCreateTriggertr_ContactOnContactAfterInsertAsSelectName,SexFromInserted/*显示Inserted表的内容,用来判断触发器执行的先后顺序*/Go然后Insert数据,判断After触发器的执行顺序usetempdbGoInsertIntoContact(Name,Sex)Values('Bill','U')Go这里,在没有运行Inser
6、t语句之前,我们可以判断,执行Insert过程会触发Check错误,因为字段Sex的值必须是”F”Or“M”,而这里将要插入的是”U”.好了,再来看运行Insert语句后的情况。本例子,只看到引发Check约束冲突的错误,而无法看到Inserted表的数据,说明一点就是,引起Check约束之前,不会引发After触发器tr_Contact的操作。这就验证了图1的After触发器执行顺序情况。 好了,接下来,我们再测试InsteadOf触发器图2的情况;我使用上边建好的测试表Contact来举例。先修改触发器tr_
7、Contact内容,usetempdbGoIfExists(Select1Fromsys.triggersWherename='tr_Contact')DropTriggertr_ContactGoCreateTriggertr_ContactOnContactInsteadOfInsertAsprint'触发器作代替执行操作'InsertIntoContact(Name,Sex)SelectName,SexFromInserted/*代替触发器外面的Insert行为*/Go再Insert数据,观察SQLServer执
8、行后的提示信息,usetempdbGoInsertIntoContact(Name,Sex)Values('Bill','U')Go 这里,看到,先是触发器操作,再是Check约束处理。本例中,在触发器里面使用一条Insert的语句来描述触发器的代替执行操作,这SQL语句通过Select表Inserted得到触发器外面Inser
此文档下载收益归作者所有