我有一个错误级别 16 警报设置如下:
USE [msdb]
GO
EXEC msdb.dbo.sp_add_alert @name=N'Error - Severity 16',
@message_id=0,
@severity=16,
@enabled=1,
@delay_between_responses=0,
@include_event_description_in=1,
@category_name=N'[Uncategorized]',
@job_id=N'00000000-0000-0000-0000-000000000000'
我很好奇为什么
SELECT 1/0;
消息 8134,级别 16,状态 1,第 17 行遇到除以零错误。
没有引发错误,但
BACKUP DATABASE MyDatabase TO DISK = 'C:\FolderThatDoesntexist'
消息 3201,级别 16,状态 1,第 8 行无法打开备份设备“C:\FolderThatDoesntexist”。操作系统错误 5(拒绝访问。)。
消息 3013,级别 16,状态 1,第 8 行备份数据库异常终止。
曾是
这篇文章和它引用的博客文章表明 SQL Server 只会为记录的错误引发事件,这可以在sys.messages
所以我查询sys.messages
了这些错误代码:
SELECT severity,
message_id,
is_event_logged
FROM sys.messages
WHERE language_id = 1033 AND
message_id IN (8134,3201,3013)
但发现三个都设置为0:
为什么 3201 和 3013 会触发我的警报而 8134 不会?
只有发送到 windows 应用程序事件日志的事件才能用于警报。
这可以在指定
RAISERROR
时完成,WITH LOG
请参阅文档以下代码将产生 2 个错误,第二个将发送到事件日志,第一个不会。第二个会触发你的警报,第一个不会。
操作系统错误(如访问被拒绝、磁盘空间不足......)被记录到 Windows 的应用程序事件日志中。
除以零不会记录到 Windows 的应用程序事件日志中。
这是触发备份错误警报的消息。
哪些是在 SSMS 和您的查询中显示的不同消息。您可以通过提供过滤器在警报上对此进行测试。message_id 在事件日志中可见:
如何触发警报
您可以像这样包装您的代码并重新引发异常
WITH LOG
,然后您的警报应该会起作用。另请阅读 SQL 服务器警报的备注。