关于触发器中的回滚问题

lbph1 2013-11-06 05:27:09
在官方文档http://technet.microsoft.com/zh-cn/library/ms181299.aspx中“互操作性”段落中有这么一句:
触发器继续执行 ROLLBACK 语句之后的所有其余语句。 如果这些语句中的任意语句修改数据,则不回滚这些修改。 执行其余的语句不会激发嵌套触发器。
其中“执行其余的语句不会激发嵌套触发器”,是否意味着在回滚操作后面的语句如果继续执行的话,后面语句触发的触发器就不会执行了。比如后面的语句有针对一个表的update操作,而这张表又有update的触发器,这个时候update会执行成功,但触发器不会执行?
...全文
267 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
lbph1 2013-11-06
  • 打赏
  • 举报
回复
to yupeigu: 确实,我使用你的代码测试,确实触发了嵌套触发器。有点让人费解……
LongRui888 2013-11-06
  • 打赏
  • 举报
回复
但是很奇怪,我做了一个实验,发现,即使是嵌套触发器,也能够被触发,和微软文档上说的不一样。 从下面的insert时的输出,可以看出,在触发器中rollback之后的语句,是可以执行的,另外,update另一个表的操作也执行成功,并且触发了触发器。


--drop table t1
--drop table t2

create table t1(id int)
create table t2(id int)

insert into t2
values(100)
go

create trigger dbo.trigger_t1
on t1
for insert
as

rollback;

select '这是rollback之后的语句,这里能执行'

update t2
set id = 1;
go



create trigger dbo.trigger_t2
on t2
for update
as

select '这是t2的update触发器,这里能执行'

go


--插入数据
insert into t1
values(1)
/*
这是rollback之后的语句,这里能执行

这是t2的update触发器,这里能执行

消息 3609,级别 16,状态 1,第 3 行
事务在触发器中结束。批处理已中止。
*/ 

--没有记录
select * from t1


select * from t2
/*
id
1
*/
LongRui888 2013-11-06
  • 打赏
  • 举报
回复
引用 楼主 lbph1 的回复:
在官方文档http://technet.microsoft.com/zh-cn/library/ms181299.aspx中“互操作性”段落中有这么一句: 触发器继续执行 ROLLBACK 语句之后的所有其余语句。 如果这些语句中的任意语句修改数据,则不回滚这些修改。 执行其余的语句不会激发嵌套触发器。 其中“执行其余的语句不会激发嵌套触发器”,是否意味着在回滚操作后面的语句如果继续执行的话,后面语句触发的触发器就不会执行了。比如后面的语句有针对一个表的update操作,而这张表又有update的触发器,这个时候update会执行成功,但触发器不会执行?
注意,在你发的连接中,只是说,在触发器中rollback之后,可以继续执行触发器中的rollback之后的语句,如果在你的触发器中,后面还有update语句,而update语句会触发另一个表的触发器,那么这个update操作应该是可以执行的,但不会引起update触发器。 因为,这种情况下,也就是在一个触发器中引起另一个触发器,就是所谓的嵌套触发器。 所以嵌套触发器
發糞塗牆 2013-11-06
  • 打赏
  • 举报
回复
嵌套触发器和你这句:是否意味着在回滚操作后面的语句如果继续执行的话,后面语句触发的触发器就不会执行了。是不一样的。你那句是顺序,不是嵌套,

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧