sql-server - 从存储过程记录 SQL Server 错误

标签 sql-server

我们的应用程序是 Windows 服务(用 C++ 编写的 native .EXE),它调用 SQL Server 中的存储过程。在大多数情况下,存储过程中的错误(在 90% 的情况下,这些错误意味着我们的业务逻辑中出现了问题)会作为异常重新抛出并被我们的服务捕获。然后,它们会记录在运行我们的服务的计算机上的应用程序事件日志中。

但是,我现在需要在存储过程中记录 SQL Server 本身的一些错误。

按照我们用于服务的范例,我想我可以使用 xp_logevent 在事件日志中保存错误信息。

这是记录 SQL Server 错误的推荐方法吗?

FWIW我使用SQL Server 2008

最佳答案

操作方法

您始终可以使用 RAISEERROR() AND LOG。记录到 Windows 应用程序日志和 SQL 错误日志。请注意,严重级别是此处的关键。有一些限制和安全考虑,但您还可以获得一些其他功能。 BOL 中的更多详细信息: http://msdn.microsoft.com/en-us/library/ms178592.aspx

你应该

我的观点是,你不应该在 SQL 错误日志中记录任何内容,除非它是由 SQL Server 本身生成的。多种原因:

  1. 如果您的 IT 或 DBA 使用日志分析器或任何其他工具,它可能会针对应用程序问题而不是服务器问题发出警报(这正是他们试图捕获的问题)。
  2. 我从来没有发现在 SQL Server 中解析错误日志有什么乐趣,而且我也不是特别喜欢 SSMS 的处理方式。

我的建议

使用通用日志记录存储过程写入某些错误日志表。一个非常好的模式是

BEGIN TRY
...do your stuff
END TRY
BEGIN CATCH
  get the ERROR_LINE(), ERROR_MESSAGE() and friends
  execute generic logging procedure
END  CATCH

作为奖励,您可以在日志记录过程中使用 SSSB 使其异步而不妨碍主逻辑流

关于sql-server - 从存储过程记录 SQL Server 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5748779/

相关文章:

sql - 作为 UDF 结果的列上的 Where 子句

mysql - 对这个简单的 INNER JOIN 查询有疑问吗?

sql-server - 对于 XML 路径 ('' ) : Escaping "special" characters

c# - 如何获取数据表中数据行的列值

SQL Server组合键问题

SQL Server 2012 : how to get count group by from multiple table joins

sql-server - 提高大小超过 40 GB (Sql Server 2005) 且每月增长约 3GB 的数据库性能的技巧

sql - 使用 SQL 根据不同月份聚合年度数据

sql - 在SQL中将两列数据合并为一列?

sql-server - SELECT FOR XML 查询速度慢吗?