2013-07-24 58 views
0

在Sql Server 2008中,我被要求编写触发器在我构建的应用程序中执行各种类型的日志记录。问题是我的SQL是生锈的,有时我在触发器中执行日志的一些事情会意外地出错。我打算最终计算出所有错误,但同时我的触发器代码正在破坏我的应用程序,因为如果触发器意外失败,它会回滚更新或插入,从而触发它破坏应用程序的各个部分。我试图在触发器代码中放置一个try catch块,但是它似乎并没有做到我习惯于在其他语言中做的事情,并且即使这样做也会回滚原始事务。防止sql触发器回滚原始事务出错

有没有人知道/如果你可以写一个触发器,当它发生错误时,它只是优雅地死掉,并让触发它的事务完成?

+1

检查 - http://stackoverflow.com/questions/17722967/how-to-ignoring-errors-in-trigger-and-perform-respective-operation-in-ms-sql-ser/ 17724709#17724709我认为修复触发器更容易,更好,因此不会出错。 –

+0

[http://stackoverflow.com/a/2163041/1114171](http://stackoverflow.com/a/2163041/1114171) –

+1

通常最好从触发器排队工作,然后拿起排队的工作在它自己的事务中并从那里继续(通过服务代理,SQL代理作业等)。但是这个建议只有在你能够理解基础时才有效。 –

回答

2

您可以将您的触发器正文代码放入try-catch block

CREATE TRIGGER tg 
ON tt 
AFTER DELETE 
AS 
    set xact_abort off; 
    BEGIN TRY 
     sql_statements 
    END TRY 
    BEGIN CATCH 
      dies gracefully 
    END CATCH; 

记得设置xact_abort为关闭,以避免自动回滚当前事务。

sql fiddle sample