情况是这样的,公司的逻辑是在触发器中做一堆事情,然后最后成功或者回滚
我在这些逻辑中会通过一个公用sp记录很多的日志信息到一张审计表,可是万一最后触发器回滚了,我记录的那些信息也都被回滚了。
sqlserver没有自治事务的概念,google了下,方案是用CLR来实现,感觉有点复杂,能不能有简单的在T-SQL级别能搞定的方案?
比如用Service Broker之类的异步消息件能实现么? 或者别的方法,谢谢大家。

解决方案 »

  1.   

    触发器回滚也是在指定程序范围(begin tran 到 rollback tran 之间)语句内容的回滚,你把你写的东西放在begin tran前不就行了.
      

  2.   

    触发器中并没有显示的begin tran,但遇到问题时会显示的rollback。
    而且我想实现的是即使我的记录日志的sp是在触发器的begin tran 和 rollback之间的时候,我也能够成功的记录下我想要的调试信息,就是类似自治事务的概念了。
    目前只google到了CLR的方法,感觉有点复杂,不知道有没有别的方法呢?
      

  3.   

    OrchidCat:
    是的,我之前几乎不用触发器,可是现在代码框架就是这样,逼的我不得不去在触发器里面想一些绕过去的点子。想要彻底的弃用触发器,短期内几乎是不可能的....
      

  4.   


    触发器本身就是一个事务。 如果不论触发器是否正确执行,均需进行记录的话。LZ可以考虑前台做处理。而无须在触发器中处理。如果需要用自治事务方式处理的话,LZ可以用begin trans D1
        begin trans G1
           记录日志处理
        end trans G1    begin trans T1
          触发器中处理的那一堆      失败 rollback trans T1
        end trans T1end trans D1
      

  5.   

    SQL SERVER中只能调节数据库的隔离级别 而且只在当前事务生效使用 最低级别的隔离级别试试但是这样不能保证数据的安全性。
      

  6.   

    谢谢楼上各位
    其实我本意是想实现sqlserver的自治事务,可以确保我的记录日志的信息不会因为外层的事务回滚而也消失。
    2008已经有方法实现了,可是2005除了CLR好像还么google到好的方案。