【问题标题】:SQL Server Query log for failed/incorrect queries?失败/不正确查询的 SQL Server 查询日志?
【发布时间】:2011-09-14 12:32:56
【问题描述】:

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

SELECT * FROM NonExistingTable

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

【问题讨论】:

    标签: sql sql-server-2008 logging


    【解决方案1】:

    SQL Server 不会记录这些内容,因此如果您想捕获它们,您必须使用带有过滤器的服务器端跟踪来仅捕获有错误的语句。这将是一个相当昂贵的跟踪,如果您执行RAISERROR WITH NOWAIT 之类的操作,您会得到一些误报...我想这比在任何地方实现TRY/CATCH 并自己记录错误更容易?

    SQL Server Audit 可能有办法做到这一点(取决于你的版本) 或Extended Events,但我还没有尝试用任何一个来做这个特定的事情......

    【讨论】:

    • 感谢亚伦的回复。如果之后无法获取日志,我将不得不采用分析方法。问题是,当我尝试重现错误时,男性不会发生这种情况。它只会在另一台机器上偶尔发生一次。
    • @Joe - 请参阅 my answer here 了解可能让您开始扩展活动路线的内容。这应该比跟踪开销更少,因为事件只会在错误时触发,而不是捕获所有 SQL 语句然后过滤掉没有错误的语句。
    【解决方案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 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;
    

    【讨论】:

      猜你喜欢
      • 2011-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-29
      • 2017-04-12
      • 2011-09-26
      • 1970-01-01
      • 2022-11-16
      相关资源
      最近更新 更多