【发布时间】:2011-09-14 12:32:56
【问题描述】:
我正在使用 SQL Server 2008,我想知道是否有办法找到已在数据库中执行的无效 SQL 查询。例如:
SELECT * FROM NonExistingTable
...数据库不存在或SELECT/INSERT/UPDATE 语法不正确。
【问题讨论】:
标签: sql sql-server-2008 logging
我正在使用 SQL Server 2008,我想知道是否有办法找到已在数据库中执行的无效 SQL 查询。例如:
SELECT * FROM NonExistingTable
...数据库不存在或SELECT/INSERT/UPDATE 语法不正确。
【问题讨论】:
标签: sql sql-server-2008 logging
SQL Server 不会记录这些内容,因此如果您想捕获它们,您必须使用带有过滤器的服务器端跟踪来仅捕获有错误的语句。这将是一个相当昂贵的跟踪,如果您执行RAISERROR WITH NOWAIT 之类的操作,您会得到一些误报...我想这比在任何地方实现TRY/CATCH 并自己记录错误更容易?
SQL Server Audit 可能有办法做到这一点(取决于你的版本) 或Extended Events,但我还没有尝试用任何一个来做这个特定的事情......
【讨论】:
记录消息 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 alertcreate 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;
【讨论】: