car*_*reo 6 sql-server sql-server-2008-r2
我有一个 Microsoft SQL Server 2008 R2 数据库。
我有一些不同编程语言的应用程序。其中一些是遗留的,我不想修改它们。
有没有办法在服务器级别记录所有查询错误,而不管导致它的应用程序?
我想知道,对于每个错误,导致它的查询、错误类型以及理想情况下的登录名和主机名。
如果您只是想记录此信息,则可以设置扩展事件会话并捕获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 日志,您将能够看到所有记录的错误。
是的。监视错误和警告事件类别中的事件通知。具体来说,将为每个错误引发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)
| 归档时间: |
|
| 查看次数: |
11102 次 |
| 最近记录: |