我正在使用SQL Server 2008,我想知道是否有办法找到已在数据库中执行的无效SQL查询。例如:
SELECT * FROM NonExistingTable
...数据库不存在或语法错误的SELECT/INSERT/UPDATE
。
答案 0 :(得分:9)
SQL Server不会记录这些内容,因此如果要捕获它们,则必须使用带有过滤器的服务器端跟踪来捕获有错误的语句。这将是一个非常昂贵的痕迹,如果你做RAISERROR WITH NOWAIT
之类的事情,你会得到一些误报...我想这比在任何地方实施TRY
/ CATCH
更容易并记录自己错了?
使用SQL Server Audit可能有办法(取决于您的版本) 或者Extended Events但是我没有尝试用这两种方法来做这件事......
答案 1 :(得分:2)
记录消息229严重性14肯定会帮助您确定何时发生这些错误。
SELECT * FROM master.sys.messages
WHERE language_id=1033
AND severity=14
AND message_id=229;
您可以使用以下方式启用它:
EXEC sp_altermessage 229, 'WITH_LOG', 'true';
我发现create an alert有关严重级别14错误的通知,因为您也需要设置运营商。
唯一的限制是它没有提供出现错误的会话的登录名,主机名或IP地址。它会记录SPID,您必须使用EXEC xp_readerrorlog通过使用
之类的东西来检索它EXEC xp_readerrorlog 0,1,'permission',NULL,NULL,NULL,'desc'
或在SSMS上打开它,然后将其与使用
在sysprocesses上找到的内容相关联SELECT * FROM master.dbo.sysprocesses WHERE SPID='LoggedSPID'
您可以启用您可能想要了解的其他消息的记录,为此,主要依据严重性14并根据需要启用。
SELECT * FROM master.sys.messages
WHERE language_id=1033
AND severity=14;