Eu tenho um alerta de nível de erro 16 configurado da seguinte forma:
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'
fiquei curioso porque
SELECT 1/0;
Msg 8134, Level 16, State 1, Line 17 Erro de divisão por zero encontrado.
não estava gerando um erro, mas
BACKUP DATABASE MyDatabase TO DISK = 'C:\FolderThatDoesntexist'
Msg 3201, Level 16, State 1, Line 8 Não é possível abrir o dispositivo de backup 'C:\FolderThatDoesntexist'. Erro do sistema operacional 5 (Acesso negado.).
Msg 3013, Level 16, State 1, Line 8 BACKUP DATABASE está terminando de forma anormal.
foi
Esta postagem e a postagem do blog que ela faz referência sugerem que o SQL Server gerará apenas eventos para erros registrados e isso pode ser encontrado emsys.messages
Então eu consultei sys.messages
por estes códigos de erro:
SELECT severity,
message_id,
is_event_logged
FROM sys.messages
WHERE language_id = 1033 AND
message_id IN (8134,3201,3013)
mas descobri que todos os três estão definidos como 0:
Por que, portanto, 3201 e 3013 acionam meu alerta, mas 8134 não?
Somente os eventos que são enviados para o log de eventos do aplicativo do Windows podem ser usados para alerta.
Isto pode ser feito com
RAISERROR
quandoWITH LOG
é especificado veja a documentaçãoO código a seguir irá gerar 2 erros, o segundo será enviado para o log de eventos, o primeiro não. O segundo acionará seu alerta, o primeiro não.
Erros do sistema operacional (como acesso negado, espaço em disco insuficiente, ...) são registrados no log de eventos do aplicativo do Windows.
A divisão por zero não é registrada no log de eventos do aplicativo do Windows.
Estas são as mensagens que acionam o alerta para o erro de backup.
Que são mensagens diferentes exibidas no SSMS e em sua consulta. Você pode testar isso em seu alerta fornecendo um filtro. O message_id é visível no log de eventos:
Como acionar o alerta
Você pode encapsular seu código assim e relançar a exceção
WITH LOG
e, em seguida, seu alerta deve funcionar.Leia também as observações dos alertas do servidor SQL.