记录查询中的所有错误

car*_*reo 6 sql-server sql-server-2008-r2

我有一个 Microsoft SQL Server 2008 R2 数据库。

我有一些不同编程语言的应用程序。其中一些是遗留的,我不想修改它们。

有没有办法在服务器级别记录所有查询错误,而不管导致它的应用程序?

我想知道,对于每个错误,导致它的查询、错误类型以及理想情况下的登录名和主机名。

Tho*_*ger 9

如果您只是想记录此信息,则可以设置扩展事件会话并捕获error_reported事件。下面是一个例子:

CREATE EVENT SESSION [ErrorCapture] 
ON SERVER 
ADD EVENT sqlserver.error_reported
(
    ACTION
    (
        sqlserver.client_hostname,
        sqlserver.database_id,
        sqlserver.sql_text,
        sqlserver.username
    )
    WHERE 
    (
        [severity] >= (11)
    )
) 
ADD TARGET package0.asynchronous_file_target
(
    SET filename=N'C:\SqlServer\Testing\ErrorCapture.xel'
)
WITH 
(
    MAX_MEMORY=4096 KB,
    EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,
    MAX_DISPATCH_LATENCY=30 SECONDS,
    MAX_EVENT_SIZE=0 KB,
    MEMORY_PARTITION_MODE=NONE,
    TRACK_CAUSALITY=OFF,
    STARTUP_STATE=ON
);
GO

ALTER EVENT SESSION [ErrorCapture]
ON SERVER
STATE = START;
GO
Run Code Online (Sandbox Code Playgroud)

为了测试这一点,这里有一个测试错误RAISERROR()

raiserror('This is a test error', 2, 1);
go
Run Code Online (Sandbox Code Playgroud)

然后通过sys.fn_xe_file_target_read_file系统函数查看 XE 日志,您将能够看到所有记录的错误。


Rem*_*anu 5

是的。监视错误和警告事件类别中的事件通知。具体来说,将为每个错误引发Exception事件。例如,基于MS SQL Server 第三方事务阻塞监控工具中的代码

use msdb;
go

create queue [errors];
go

create service errors on queue [errors] (
    [http://schemas.microsoft.com/SQL/Notifications/PostEventNotification]);
go

create event notification [errors]
    on server for EXCEPTION
    to service N'errors', N'current database';
go
Run Code Online (Sandbox Code Playgroud)

如果我们检查队列,我们​​将看到报告的所有异常:

receive cast(message_body as xml) from errors;


<EVENT_INSTANCE>
  <EventType>EXCEPTION</EventType>
  <PostTime>2013-02-19T13:52:21.443</PostTime>
  <TextData>Violation of PRIMARY KEY constraint 'PK__x__3213E83F31271CCE'. Cannot insert duplicate key in object 'dbo.x'. The duplicate key value is (1).</TextData>
  ...
  <HostName>...</HostName>
  <ApplicationName>Microsoft SQL Server Management Studio - Query</ApplicationName>
  <LoginName>...</LoginName>
  ...
</EVENT_INSTANCE>
Run Code Online (Sandbox Code Playgroud)