防止sql触发器在出现错误时回滚原始事务

防止sql触发器在出现错误时回滚原始事务,sql,sql-server-2008,Sql,Sql Server 2008,在SQLServer2008中,我被要求编写触发器,以便在我构建的应用程序中执行各种类型的日志记录。问题是我的SQL已经生锈了,有时我放在触发器中用来记录日志的一些东西会意外地出错。我打算最终解决所有错误,但与此同时,我的触发器代码正在破坏我的应用程序,因为如果触发器意外失败,它将回滚触发它的更新或插入,从而破坏应用程序的各个部分。我试图在触发器代码周围放置一个try-catch块,但它似乎没有像我在其他语言中习惯的那样执行,而且它甚至会回滚原始事务 是否有人知道如何/如果您可以编写一个触发器,

在SQLServer2008中,我被要求编写触发器,以便在我构建的应用程序中执行各种类型的日志记录。问题是我的SQL已经生锈了,有时我放在触发器中用来记录日志的一些东西会意外地出错。我打算最终解决所有错误,但与此同时,我的触发器代码正在破坏我的应用程序,因为如果触发器意外失败,它将回滚触发它的更新或插入,从而破坏应用程序的各个部分。我试图在触发器代码周围放置一个try-catch块,但它似乎没有像我在其他语言中习惯的那样执行,而且它甚至会回滚原始事务


是否有人知道如何/如果您可以编写一个触发器,当它出错时,它会优雅地消失,并让触发它的事务完成

您可以将触发器主体代码封装到

记住设置为off以避免自动回滚当前事务


检查-我认为修复触发器更容易、更好,这样它就不会出错。通常最好从触发器将工作排队,然后在其自己的事务中提取排队的工作并从那里开始(通过service broker、sql代理作业等)。但这一建议只有在你能克服基本问题的情况下才有效。
CREATE TRIGGER tg
ON tt
AFTER DELETE
AS
    set xact_abort off; 
    BEGIN TRY
         sql_statements
    END TRY
    BEGIN CATCH
          dies gracefully
    END CATCH;