【问题标题】:TSQL: TRY CATCH error handling with logging errors into a tableTSQL:TRY CATCH 错误处理,将错误记录到表中
【发布时间】:2016-07-14 05:23:05
【问题描述】:

使用 SQL Server 2014:

我正在阅读以下文章,其中包含 TSQL 错误处理的有用模式:

https://msdn.microsoft.com/en-IN/library/ms175976.aspx

我喜欢记录错误,以便以后可以查询、监控、跟踪和检查应用程序存储过程中发生的错误。

我正在考虑创建一个表并将错误详细信息作为一行插入 CATCH 块中的表中;但是我担心这可能不是一个好的模式,或者可能有一个内置的 SQL 服务器功能可以记录 ;THROW 语句生成的错误。

记录错误的最佳方法是什么?

更新 1

我应该提到我总是在我的 SP 之上设置 XACT_ABORT:

SET XACT_ABORT,NOCOUNT ON

假设 XACT_ABORT 为 ON 时无法记录错误是否安全?

更新 2

SET XACT_ABORT ON 根据这篇文章:

http://www.sommarskog.se/error_handling/Part1.html#jumpXACT_ABORT

xp_logevent 是否比向日志表中添加错误记录更好?

【问题讨论】:

    标签: sql-server tsql error-handling


    【解决方案1】:

    您必须非常小心从 CATCH 锁进行日志记录。首先,您必须检查XACT_STATE() 并遵守它。如果 xact_state 为 -1 ( 'uncommittable transaction')你不能做任何事务操作,所以 INSERT 失败。您必须先回滚,然后再插入。但是您不能简单地回滚,因为您可能处于 xact_state 0(无事务),在这种情况下回滚将失败。如果 xact_state 为 1,则您仍处于原始事务中,并且您的 INSERT 可能仍会在稍后回滚,并且您将失去对该错误发生的所有跟踪。

    要考虑的另一种方法是使用sp_trace_generateevent 生成用户定义的分析器事件,并让系统跟踪监控您的用户事件ID。这适用于任何 xact_state 状态,并且具有保留记录的优势,即使包含的事务稍后会回滚。

    我应该提到我总是设置 XACT_ABORT

    停止这样做。阅读Exception handling and nested transactions,了解针对错误处理和事务的良好 SP 模式。

    【讨论】:

    【解决方案2】:

    是的,它更好。 如果你想存储,那么试试这个。

    declare @Error_msg_desc    varchar(500)
    ,@Error_err_code   int            
    ,@Error_sev_num int        
    ,@Error_proc_nm varchar(100)     
    ,@Error_line_num    int     
    begin try
        select 1/0
    end try
    begin catch
        select   @Error_err_code = ERROR_NUMBER()         
                ,@Error_msg_desc = ERROR_MESSAGE()       
                ,@Error_sev_num  = ERROR_SEVERITY()        
                ,@Error_proc_nm  = ERROR_PROCEDURE()        
                ,@Error_line_num = ERROR_LINE() 
        --create SqlLog Table       
        --Insert into Log Table 
        Insert into Sqllog values(@Error_err_code,@Error_msg_desc,@Error_sev_num,@Error_proc_nm,@Error_line_num)            
    end catch
    

    【讨论】:

    • 它将回滚整个事务并中止该批处理但无法记录错误。
    • 那么,假设 SET XACT_ABORT ON 不会发生错误记录是否安全?
    • 我对 XACT_ABORT 了解不多,但请看这篇文章,希望对您有所帮助stackoverflow.com/a/1150069/5897242
    猜你喜欢
    • 2023-01-09
    • 1970-01-01
    • 2013-01-21
    • 2019-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-17
    相关资源
    最近更新 更多