使用SQL Server 2014:
我将阅读以下文章,其中包含有关TSQL错误处理的有用模式:
https://msdn.microsoft.com/en-IN/library/ms175976.aspx
我喜欢记录错误以便稍后我可以查询,监视,跟踪和检查我的应用程序的存储过程中发生的错误 .
我正在考虑创建一个表并将错误详细信息作为一行插入到CATCH块的表中;但是我担心这可能不是一个好的模式或者可能有一个内置的SQL服务器功能可以记录由; THROW语句生成的错误 .
记录错误的最佳方法是什么?
Update 1
我应该提一下,我总是在我的SP上设置XACT_ABORT:
SET XACT_ABORT,NOCOUNT ON
假设XACT_ABORT为ON时无法记录错误,这是否安全?
Update 2
SET XACT_ABORT ON根据这篇文章:
http://www.sommarskog.se/error_handling/Part1.html#jumpXACT_ABORT
xp_logevent可以比将错误记录添加到日志表更好吗?
2 回答
从CATCH锁定进行日志记录时必须非常小心 . 首先,你 must 检查XACT_STATE()并尊重它 . 如果xact_state为-1('uncommittable transaction'),则无法执行任何事务操作,因此INSERT失败 . 您必须首先回滚,然后插入 . 但是你不能简单地回滚,因为你可能在xact_state 0(没有事务),在这种情况下回滚会失败 . 如果xact_state为1,那么您仍处于原始事务中,并且您的INSERT可能仍会在以后回滚,并且您将放弃所有发生此错误的跟踪 .
另一种需要考虑的方法是使用sp_trace_generateevent生成用户定义的探查器事件,并使用系统跟踪监视您的用户事件ID . 这适用于任何xact_state状态,并且即使包含的事务稍后将回滚,也具有保留记录的优点 .
停止这样做 . 阅读Exception handling and nested transactions以获得良好的SP模式,以及错误处理和事务处理 .
是的,它更好 . 如果你想存储,那试试这个 .