SQL Server查询日志是否存在失败/错误查询?

Joe*_*Joe 12 sql logging sql-server-2008

我正在使用SQL Server 2008,我想知道是否有办法找到已在数据库中执行的无效SQL查询.例如:

SELECT * FROM NonExistingTable
Run Code Online (Sandbox Code Playgroud)

...数据库不存在或SELECT/INSERT/UPDATE语法不正确的地方.

Aar*_*and 9

SQL Server不会记录这些内容,因此如果要捕获它们,则必须使用带有过滤器的服务器端跟踪来捕获有错误的语句.这将是一个非常昂贵的痕迹,如果你做的事情,你会得到一些误报RAISERROR WITH NOWAIT...我想这比实现TRY/ CATCH到处更容易并自己记录错误?

可能有一些方法可以使用SQL Server Audit(取决于您的版本)或扩展事件来执行此操作,但我没有尝试使用其中任何一个来执行此特定操作...

  • @Joe - 请参阅[我的答案](http://stackoverflow.com/questions/3318695/how-to-implement-logging-and-error-reporting-in-sql-stored-procedures/3319031#3319031)这可能会帮助您开始扩展活动路线。这应该比跟踪更少的开销,因为事件仅在错误时触发,而不是捕获所有 SQL 语句,然后过滤掉没有错误的语句。 (2认同)

小智 6

记录消息 229 严重性 14 肯定会帮助您确定这些错误何时发生。

SELECT * FROM master.sys.messages
 WHERE language_id=1033
 AND severity=14
 AND message_id=229;
Run Code Online (Sandbox Code Playgroud)

您可以使用以下方法启用它:

EXEC sp_altermessage 229, 'WITH_LOG', 'true';
Run Code Online (Sandbox Code Playgroud)

我会针对严重性为 14 的错误创建警报,以便在发生错误时收到通知,为此您还需要设置一个操作员。

唯一的限制是它不会向您提供出现错误的会话的登录名、主机名或 IP 地址。它确实记录了 SPID,您必须使用 EXEC xp_readerrorlog 来检索它,方法是使用类似的东西

EXEC xp_readerrorlog 0,1,'permission',NULL,NULL,NULL,'desc'
Run Code Online (Sandbox Code Playgroud)

或者在 SSMS 上打开它,然后将其与您在sysprocesses上找到的内容相关联,使用

SELECT * FROM master.dbo.sysprocesses WHERE SPID='LoggedSPID'
Run Code Online (Sandbox Code Playgroud)

您可以启用您可能想要了解的其他消息的日志记录,为此,主要研究严重性 14 并根据需要启用。

SELECT * FROM master.sys.messages
 WHERE language_id=1033
 AND severity=14;
Run Code Online (Sandbox Code Playgroud)