Ezi Asked: 2011-10-05 09:14:39 +0800 CST2011-10-05 09:14:39 +0800 CST 2011-10-05 09:14:39 +0800 CST 触发器不应阻止插入 772 我有一个插入触发器,但如果触发器失败,插入也会失败。 即使触发器失败,有没有办法让插入继续进行? 编辑:输入新记录时,我使用触发器发送电子邮件。无论电子邮件是否发送,我都希望保存记录.. 我将如何从 sp 中做到这一点? sql-server trigger 3 个回答 Voted Best Answer gbn 2011-10-05T09:30:14+08:002011-10-05T09:30:14+08:00 不 触发器是事务的一部分 错误将中止 INSERT 语句(如果不在显式事务中) 触发器中的错误将导致事务失败(即必须回滚) 未使用TRY/CATCH 块的触发器中的错误(也在 INSERT 周围)将中止批处理 不要使用触发器。改为使用存储过程将逻辑与 INSERT 分离。 就个人而言,触发器失败意味着某些复杂的 DRI 失败或者我无法写入历史记录表。那是一件坏事…… 编辑: 使用 Service Broker 从触发器发送通知。 另一段代码将接收它并异步发送 我自己还没有实现,所以我得把你推荐给谷歌 datagod 2011-10-06T05:37:38+08:002011-10-06T05:37:38+08:00 如果您对 Service Broker 不满意,您仍然可以使用触发器,但不是发送电子邮件,而是将电子邮件的内容插入到某种 EmailQueue 表中。然后,您将有一个异步进程定期检查该表并分别处理电子邮件,并在发送时将它们从队列中删除。 将邮件的生成与邮件的发送解耦将防止插入失败,并允许您在仍然捕获要发送的新邮件的同时解决邮件问题。 jerry Hodgson 2014-05-31T20:06:22+08:002014-05-31T20:06:22+08:00 是的 触发器在其正常指令、空值等上失败 ::使用代替插入触发器开始 从插入中选择进入#inserted 声明@query nvarchar(max),@iretval int ::您可以通过将每条指令构建到查询中来绕过失败 设置@query=N'更新....等' ::在 sp_executesql 之前检查查询也是一个好主意,因为 ::如果查询为空,那么 iretval 无论如何都会为 0,即 如果@Query 为空开始设置@iretval=999 转到最后一个结束 ::然后 exec @Iretval=sp_executesql @query [[parmameters ] outvalue] if @iretval>0 goto Last :: 你的插入应该带有一个标志或其他东西来显示触发器是否工作允许后续处理触发器没有做假设这是必需的 最后的 如果@iretval=0 更新#inserted 设置标志=ok 从#inserted 中插入表选择* ::笔记。您必须检查每个语句,如果您必须从其他表中检索值,请检查这些值是否有效而不是 isnull。 如果需要一个例子。给我发电子邮件 [email protected]
不
不要使用触发器。改为使用存储过程将逻辑与 INSERT 分离。
就个人而言,触发器失败意味着某些复杂的 DRI 失败或者我无法写入历史记录表。那是一件坏事……
编辑:
我自己还没有实现,所以我得把你推荐给谷歌
如果您对 Service Broker 不满意,您仍然可以使用触发器,但不是发送电子邮件,而是将电子邮件的内容插入到某种 EmailQueue 表中。然后,您将有一个异步进程定期检查该表并分别处理电子邮件,并在发送时将它们从队列中删除。
将邮件的生成与邮件的发送解耦将防止插入失败,并允许您在仍然捕获要发送的新邮件的同时解决邮件问题。
是的
::使用代替插入触发器开始
从插入中选择进入#inserted
声明@query nvarchar(max),@iretval int
::您可以通过将每条指令构建到查询中来绕过失败
设置@query=N'更新....等'
::在 sp_executesql 之前检查查询也是一个好主意,因为 ::如果查询为空,那么 iretval 无论如何都会为 0,即
如果@Query 为空开始设置@iretval=999 转到最后一个结束
::然后
exec @Iretval=sp_executesql @query [[parmameters ] outvalue] if @iretval>0 goto Last
:: 你的插入应该带有一个标志或其他东西来显示触发器是否工作允许后续处理触发器没有做假设这是必需的
最后的
如果@iretval=0 更新#inserted 设置标志=ok
从#inserted 中插入表选择*
::笔记。您必须检查每个语句,如果您必须从其他表中检索值,请检查这些值是否有效而不是 isnull。
如果需要一个例子。给我发电子邮件 [email protected]