触发器后触发问题?

newmankind 2007-05-11 02:42:45
after触发器,为什么当触发器插入数据出错,(故意设置触发器语法插入另外表时不正确)却把所有之前的insert到表的数据也搞没了,不是后触发么,就算回滚,滚人家干嘛,死活想不明白!
...全文
348 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
newmankind 2007-05-15
  • 打赏
  • 举报
回复
to wgsasd311(自强不息)
如果after触发器按照下面定义,我就理解,但是目前的定义真是让人费解

指定触发器只有在触发 SQL 语句中指定的所有操作都已执行但未提交时才激发。所有的引用级联操作和约束检查也必须已执行但未提交,才能执行此触发器。

(原定义)
指定触发器只有在触发 SQL 语句中指定的所有操作都已成功执行后才激发。所有的引用级联操作和约束检查也必须成功完成后,才能执行此触发器。

如果仅指定 FOR 关键字,则 AFTER 是默认设置。
newmankind 2007-05-15
  • 打赏
  • 举报
回复
to gahade(与君共勉)
1、我完全理解你对一致性的解释,也完全理解对于Insead of 触发器跟insert语句是一个统一的整体事务.
2、我遇到的难题是,想找出一个不一致的东东,就是后面的触发操作对前面已完成的操作没有任何影响,我不要一致性,不一致才好呢,呵呵.(这就是我前面的说得发邮件的例子,比如插入成功了,我发邮件,如果我发不出邮件也不会影响之前的插入).
3、我之所以想不通不是你所说的触发器整体事务,而是细化分类的instead of触发器和after触发器的差别:
instead of 是前触发,就是在执行sql语句前就把执行触发器。所以触发器不成功,后面的sql语句也执行不了,而且触发器成功的部分也回滚,一点问题也没有
after是后触发,既然是后触发,就应该有明显的与前触发的区别,可是站在用户角度,前触发后触发的结果是完全一样的,只要你触发器出错,我的数据就是插不进去。那还煞有介事的分什么instead of和after和for三种干什么,就设立一种触发器得了
gahade 2007-05-11
  • 打赏
  • 举报
回复
举个删除触发器的例子

常见的主从表结构,一般是在主表有删除触发器,作用是级联删除从表对应的资料.但如果在删除从表的时候出错的话那主表的数据也要回滚的,不然肯定数据会不一致.
wgsasd311 2007-05-11
  • 打赏
  • 举报
回复
AFTER

指定触发器只有在触发 SQL 语句中指定的所有操作都已成功执行后才激发。所有的引用级联操作和约束检查也必须成功完成后,才能执行此触发器。

如果仅指定 FOR 关键字,则 AFTER 是默认设置。

不能在视图上定义 AFTER 触发器。
gahade 2007-05-11
  • 打赏
  • 举报
回复
insert语句和insert触发器是一个整体的事务~!
楼主理解了事务,为什么不理解触发器呢?

如果是数据逻辑导致的错误是和触发器本身没有关系的.
y_dong119 2007-05-11
  • 打赏
  • 举报
回复
jf
newmankind 2007-05-11
  • 打赏
  • 举报
回复
为什么非要像现在这样呢?签合同就是俩一块签,插入完,活干完了,系统告诉它,你丫坐等着,看后面的干活。它干不好,你俩谁也甭想好,一块滚蛋。
这根直接触发器接管又有多大区别呢?反正早插晚插一样等,即使早插了,也灭好处,因为触发器干坏了,还得从头。索性不如触发器你忙吧,看它干完再继续插入动作。岂不皆大欢喜。
newmankind 2007-05-11
  • 打赏
  • 举报
回复
那么当向表insert时,再向另一表插入数据的功能如何实现?
楼主不觉得你的想法矛盾了吗?

兄台,我还是不明白这句是什么意思?

只是一个单向流程,A数据插入后,成功了,有个返回告诉系统,系统会通知触发器,你干活吧,那边人家已经结帐了,然后触发器就干活。这样应该没有问题滴啊,脑子蒙蒙的
gahade 2007-05-11
  • 打赏
  • 举报
回复
理解问题.
insert语句和insert触发器为一个整体.
insert后触发insert触发器,insert触发器影响insert结果.

按楼主的理解就是insert语句可以触发触发器,但触发器不影响insert语句
就是A到B,但B不能到A,
那么当向表insert时,再向另一表插入数据的功能如何实现?
楼主不觉得你的想法矛盾了吗?
newmankind 2007-05-11
  • 打赏
  • 举报
回复
如果insert 数据到表A,我在触发器里把插入数据 插入到表B,恰恰表B根A没有一致性的关联,顶多是以日志的方式记录,成不成功都问题不大。但是现在就找不出一种触发器让A成功插入后,B插入失败却不影响到A表已插入的数据,是业务的要求,本来用sp控制会好很多,可是啊,被挤到这了,费用这倒霉的触发器。
newmankind 2007-05-11
  • 打赏
  • 举报
回复
对事务概念还算比较理解,关键是after触发器的现象不是 仅仅触发器在一个事务里,是它把insert动作也给包含到这个事务里了,这点难以接受。
gahade 2007-05-11
  • 打赏
  • 举报
回复
SQL只认xp_sendmail的返回值是否成功,如果发送成功后,邮件邮件服务器崩溃了或停电了,SQL不会知道也不会回滚.
Yang_ 2007-05-11
  • 打赏
  • 举报
回复
1楼已经解释清楚了

是不是楼主对事务的概念尚不理解??
newmankind 2007-05-11
  • 打赏
  • 举报
回复
to gahade(与君共勉)
如果是表约束我能理解,它的地位就相当于instead of触发器,要想一致,你通过我,无论哪一段出问题,都得有连带责任,一损俱损一荣俱荣。
你写的那段代码也是实际上after触发器运行的原理
begin tran
insert into 表
select '11'
触发器代码...

成功后commit tran
挫败rollback tran
但是我就不明白了,触发器若不是为了保证一致性的需求,比如我入库后就发一个邮件提醒给管理员,你总不能因为邮件发不成功不让我入库,入库的紧急程度总比发一封提醒邮件的紧急程度高很多啊,而且我也一直理解after触发器是为了满足这种需求而生的。
如果实在不能满足,兄台有好的解决办法么?现在我头疼死了。
gahade 2007-05-11
  • 打赏
  • 举报
回复
这就像如果insert时违反了主键或约束时,数据也同样会同滚的道理一样.
如果表没有任务约束或触发器,插入成功就成功了,但如果有的话它们就是一个整体事务,就像这样
begin tran
insert into 表
select '11'
触发器代码...

成功后commit tran
挫败rollback tran.

做为一个整体的事务是很有必要的,比如现在是在入库表上有触发器,触发器的代码是入库后库存增加,如果当更新库存时出错的话,入库的记录也保存到了,那何来的一致性呢?
srgcc 2007-05-11
  • 打赏
  • 举报
回复
说的好,就是不通人情啊,^_^
newmankind 2007-05-11
  • 打赏
  • 举报
回复
对于instead of触发,我能理解。但是对于after我实在想不明白,不是说是insert成功之后才触发么,应该是两个独立的事务的,你成功,我干活,我干不成,我自己负责。况且也有很多这样的业务需求,为什么非要滚人家,自己干不好,非把人家干好的也拉下水。
gahade 2007-05-11
  • 打赏
  • 举报
回复
楼主理解一下"触发器整体是一个事务"

34,587

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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