Joe*_*Joe 12 sql logging sql-server-2008
我正在使用SQL Server 2008,我想知道是否有办法找到已在数据库中执行的无效SQL查询.例如:
SELECT * FROM NonExistingTable
Run Code Online (Sandbox Code Playgroud)
...数据库不存在或SELECT/INSERT/UPDATE语法不正确的地方.
SQL Server不会记录这些内容,因此如果要捕获它们,则必须使用带有过滤器的服务器端跟踪来捕获有错误的语句.这将是一个非常昂贵的痕迹,如果你做的事情,你会得到一些误报RAISERROR WITH NOWAIT...我想这比实现TRY/ CATCH到处更容易并自己记录错误?
可能有一些方法可以使用SQL Server Audit(取决于您的版本)或扩展事件来执行此操作,但我没有尝试使用其中任何一个来执行此特定操作...
小智 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)