题
我在插入物上有一个触发器,但是如果扳机失败,插入物也会失败。
即使扳机失败,有没有办法让插入进行进行?
编辑:输入新记录时,我使用触发器发送电子邮件。我希望保存记录,无论电子邮件是否已发送。
我将如何从SP那里做到这一点?
解决方案
不
- 触发器是交易的一部分
- 错误将中止插入语句(如果不是在显式事务中)
- 触发器中的错误会注定交易(即必须回滚)
- 尝试/捕获块是触发器中的错误 不是 二手(也围绕插入物)将中止批处理
不要使用触发器。使用存储过程将逻辑从插入物中解脱出来。
就个人而言,触发失败意味着某些复杂的DRI失败了,或者我无法写入历史表。那是一件坏事...
编辑:
- 使用服务经纪人从触发器发送通知。
- 另一个代码会拾取并异步发送
我没有实施自己,所以我必须推荐你 谷歌
其他提示
如果您对服务经纪人不满意,您仍然可以使用触发器,而不是发送电子邮件,而是将电子邮件的内容插入某种电子邮件等表中。然后,您会定期进行异步过程,并分别检查该表并分别处理电子邮件,并在发送时从队列中删除它们。
通过发送邮件将邮件的生成发电将阻止插入失败,并使您能够在仍在捕获要发送的新邮件的同时对邮件问题进行故障排除。
是的
触发器在其正常说明,零值等上失败
::使用一个代替插入触发器开始
从插入中选择#插入
声明@Query nvarchar(Max), @iretval int
::您可以通过在查询中构建每个指令来绕过失败
set @query = n'update .... etc'
::在sp_executesql之前检查查询也是一个好主意,因为::如果查询为null,则IRETVAL将为0,无论如何IE IE
如果@query是null begin set @iretval = 999 goto last End
::然后
exec @iretval = sp_executesql @query [[parmameters] Outvalue]如果@iretval> 0 goto last
::您的插入物应携带标志或可以显示的东西,如果扳机工作是否有效,则允许后续处理触发器不假定这是必需的
最后的
如果 @iretval = 0更新#inserted set flag =确定
插入表中选择 *从#inserted中选择 *
::笔记。您必须检查每个语句,如果您必须从其他表中检索值,请检查值有效而不是iSnull。
如果有的话是一个例子。给我发送电子邮件jhodgson@tsti.co.za