博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
触发器学习
阅读量:6364 次
发布时间:2019-06-23

本文共 2543 字,大约阅读时间需要 8 分钟。

After 触发器将在处理触发操作(Insert、Update 或 Delete)、Instead Of 触发器和约束之后激发。Instead Of是将在处理约束前激发,以替代触发操作。

After触发器在触发时操作已影响表中数据,Instead of 触发器触发时操作未影响数据表中数据。

不存在DDL 类型的Instead of 触发器,在DDL触发器创建时可以使用Instead表和Deleted表,但是会引发运行时异常。

可以在存储过程或触发器中执行 ROLLBACK TRANSACTION 或 COMMIT TRANSACTION Transact-SQL 语句,但这样可能会导致错误。(MSDN)

应该在触发器中尽量避免事务会滚操作,测试如下:

--创建测试环境 USE tempdb GO CREATE TABLE dbo.TRTest (     ID INT ) GO CREATE TABLE dbo.TRTestHistory (   ID INT,   InsertDate datetime default GETDATE() );
-- 创建INSTEAD OF 触发器 -- 第一次向dbo.TRTestHistory插入数据,然后回滚事务 -- 第二次向dbo.TRTestHistory插入数据,然后提交事务 CREATE TRIGGER TR_TRTest ON dbo.TRTest INSTEAD OF INSERT AS BEGIN BEGIN TRAN Insert into dbo.TRTestHistory(ID) SELECT ID FROM inserted ROLLBACK TRAN BEGIN TRAN Insert into dbo.TRTestHistory(ID) SELECT ID+100 FROM inserted COMMIT TRAN END --清理表中数据 TRUNCATE TABLE dbo.TRTest TRUNCATE TABLE dbo.TRTestHistory --尝试插入数据,触发TR_TRTest触发器 INSERT INTO dbo.TRTest SELECT 1 --检查数据表中数据 SELECT * FROM dbo.TRTest SELECT * FROM dbo.TRTestHistory
结果:插入操作提示错误“The transaction ended in the trigger. The batch has been aborted.”,但dbo.TRTestHistory表中有数据插入。
 
-- 创建INSTEAD OF 触发器 -- 第一次向dbo.TRTestHistory插入数据,然后回滚事务 -- 第二次向dbo.TRTestHistory插入数据,然后提交事务 ALTER TRIGGER TR_TRTest ON dbo.TRTest INSTEAD OF INSERT AS BEGIN BEGIN TRAN TR1 Insert into dbo.TRTestHistory(ID) SELECT ID FROM inserted ROLLBACK TRAN TR2 BEGIN TRAN Insert into dbo.TRTestHistory(ID) SELECT ID+100 FROM inserted COMMIT TRAN END --清理表中数据 TRUNCATE TABLE dbo.TRTest TRUNCATE TABLE dbo.TRTestHistory --尝试插入数据,触发TR_TRTest触发器 INSERT INTO dbo.TRTest SELECT 1 --检查数据表中数据 SELECT * FROM dbo.TRTest SELECT * FROM dbo.TRTestHistory
结果:插入时异常“Cannot roll back TR1. No transaction or savepoint of that name was found. The statement has been terminated. ”,
但dbo.TRTestHistory表中没有数据
-- 创建AFTER触发器 -- 第一次向dbo.TRTestHistory插入数据,然后回滚事务 -- 第二次向dbo.TRTestHistory插入数据,然后提交事务 ALTER TRIGGER TR_TRTest ON dbo.TRTest AFTER INSERT AS BEGIN BEGIN TRAN TR1 Insert into dbo.TRTestHistory(ID) SELECT ID FROM inserted ROLLBACK TRAN TR1 BEGIN TRAN Insert into dbo.TRTestHistory(ID) SELECT ID+100 FROM inserted COMMIT TRAN END --清理表中数据 TRUNCATE TABLE dbo.TRTest TRUNCATE TABLE dbo.TRTestHistory --尝试插入数据,触发TR_TRTest触发器 INSERT INTO dbo.TRTest SELECT 1 --检查数据表中数据 SELECT * FROM dbo.TRTest SELECT * FROM dbo.TRTestHistory
结果:插入时异常“Cannot roll back TR1. No transaction or savepoint of that name was found. The statement has been terminated. ”,
但dbo.TRTestHistory表中没有数据

总结:大部分情况下在触发器中使用ROLLBACK TRAN会导致包括触发器内部以及引发触发器激活的操作在内的事务会滚,但部分情况下触发器ROLLBACK TRAN后续的操作仍能操作成功。

 

 

 

 

转载地址:http://ujama.baihongyu.com/

你可能感兴趣的文章
我的友情链接
查看>>
springboot 跨域配置cors
查看>>
Domino 8.5.1 账户配置
查看>>
isset()和empty()函数重要区别
查看>>
通过git将php项目部署到LeanCloud
查看>>
git merge —— 为什么比diff & patch好
查看>>
5.2更新顺序文件
查看>>
Web开发之分页算法,N(N>=3)种解决方案
查看>>
锁机制探究
查看>>
硬盘直接引导启动Manjaro Linux iso
查看>>
CodeSmith代码生成工具介绍
查看>>
几个常用且免费的接口
查看>>
jQuery文件上传插件 Uploadify更改错误提示的弹出框
查看>>
优化系列 | InnoDB引擎数据表压缩特性测试
查看>>
python 抓取开源中国上阅读数大于 1000 的优质文章
查看>>
虚拟机下克隆CentOS引起的MAC地址冲突问题
查看>>
Python这么强大, 怎样才能快速入坑?
查看>>
ansible配置文件介绍及命令介绍
查看>>
maven 项目 pom 文件 报错org.apache.maven.archiver.MavenArchiver.getManifest(org.apache.maven.project...
查看>>
揭秘设计模式:建造者模式(Builder)的理解和学习
查看>>