存储过程P使用了
begin try
begin transaction
insert into A(...)values (..) --A表有一个AFTER INSERT 的触发器,主要是A表插入一条数据后更新B表。但是问题来了:更新B表的时候发生异常了,这个异常是在触发器里面的,存储过程P能捕获到这个异常跳到cathc里面去吗?如果不会跳到里面去的话会有什么结果发生呢?插入A表后面还有执行的代码,我的成功返回00失败返回01,当触发器发生异常的时候我的客户端收不到任何东西,这个是为什么呢?我要不要在触发器里面也 加上异常事务处理呢?
commit transaction
end try
begin catch
rollback transaction
end catch
SQL?Server 存储过程,触发器异常 异常 事务
------解决方案--------------------
就我知道的,触发器里面通常不写try catch以及 begin transaction 之类的定义,因为这个会导致你这样的问题。通常情况下都不会写,微软也不建议写。除非极特殊情况。
基于上面的条件,如果在你的A表后的触发器中,出现更新B表的异常,这个会被P捕捉到,然后执行catch语句,try catch之后的语句还是会正常执行。
按照你的描述,估计是在触发器中写了raiseerror的缘故。这个也会导致这个问题的。我好久没弄这个了,记不太清了,不过你可以试试。
------解决方案--------------------
触发器可以写条件的