能不能忽略触发器中的错误?

highscore2 2013-10-24 08:49:57
我的情况是这样的: 当向A表插入数据时,需要向某用户发送信息通知,由于插入数据方是第三方软件做的,我控件不了,所以我在A表加个触发器来实现,现在问题是发送信息这里的错误是可以忽略的,就是说假如发送失败不影响数据的插入,请问我在触发器里如何忽略错误,让事务继续执行.
...全文
282 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
LongRui888 2013-10-24
  • 打赏
  • 举报
回复
再试试这个:


--先保存一个事务点
SAVEPOINT xxx 

begin try  
   --或者是调用存储过程,或者就直接写代码
   exec 发送信息的存储过程      
end try  
begin catch  
  select '执行失败'  
  --一旦出错,只是回滚到上面的事务点,继续执行
  ROLLBACK [WORK] TO SAVEPOINT xxx
end catch  

--其他代码
LongRui888 2013-10-24
  • 打赏
  • 举报
回复
另外,建议你把发送消息的代码,放到一个存储过程中,然后在触发器中调用这个存储过程: begin try exec 发送信息的存储过程 end try begin catch select '执行失败' --这里不会滚 end catch
LongRui888 2013-10-24
  • 打赏
  • 举报
回复
在触发器里面: 发送信息的操作 if @@error <> 0 print 'error' 只是判断一下错误,可以继续运行
水族杰纶 2013-10-24
  • 打赏
  • 举报
回复
可以考虑在要操作的表里添加一个状态列 把插入数据与发送消息作为两个逻辑处理 插入数据的时候默认给一个状态 然后定时去发送消息发送完毕后将状态置为为另一个值
highscore2 2013-10-24
  • 打赏
  • 举报
回复
不行,catch 到错误时,事务必须回滚,再对数据库的操作也不能保存。
發糞塗牆 2013-10-24
  • 打赏
  • 举报
回复
不好意思,误导了,finally是C#的概念,混淆了。你也依旧可以用try catch,只是catch到error时,不回滚,把你想执行的语句放入catch试试。但是不保证能成功。
highscore2 2013-10-24
  • 打赏
  • 举报
回复
在联机帮助上没查到有final 的信息,能否贴点代码来看看呢? 如果用final?
發糞塗牆 2013-10-24
  • 打赏
  • 举报
回复
在触发器中加上try catch,然后把最终还是想继续的操作放到final里面,但是从维护数据的一致性来说,不建议忽略,因为你的数据违反了你自己或者sqlserver定下的规则

22,209

社区成员

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

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