web-dev-qa-db-fra.com

Comment créer une alerte d'agent SQL sur un message d'erreur personnalisé dans SQL Server 2012?

Je souhaite que les opérateurs soient avertis lorsque je jette un message d'erreur personnalisé. Ma compréhension est que je dois ajouter un message à Sys.Messages, puis je peux soit RAISERROR ou THROW cette carte d'erreur. Créer une alerte sur l'ID de message et la définition pour envoyer aux opérateurs doit créer ces notifications.

J'ai créé une alerte d'agent SQL sur l'ID de message de 50005 et j'utilise le T-SQL suivant pour créer le message:

EXEC sp_addmessage @msgnum = 50005,
          @severity = 16,
          @msgtext = N'%s';
GO

Ensuite, si j'exécute ceci:

RAISERROR (50005, -- Message id.
       16, -- Severity,
       1, -- State,
       N'My custom message');
THROW 50005, 'My custom message', 1;
GO

Je reçois la sortie suivante comme prévu à partir de deux RAISERROR et THROW:

Msg 50005, niveau 16, état 1, ligne 68 Mon message personnalisé

Lorsque j'appuie l'historique de l'alerte, cela montre qu'elle n'a pas été déclenchée et que l'opérateur ne reçoit pas de mise à jour de courrier électronique.

Mon agent Alerte ressemble à ceci:

Agent Alert Setup

Scripting L'alerte génère ce qui suit:

USE [msdb]
GO
EXEC msdb.dbo.sp_update_alert @name=N'Alert DBA on custom errors', 
    @message_id=50005, 
    @severity=0, 
    @enabled=1, 
    @delay_between_responses=0, 
    @include_event_description_in=1, 
    @database_name=N'', 
    @notification_message=N'', 
    @event_description_keyword=N'', 
    @performance_condition=N'', 
    @wmi_namespace=N'', 
    @wmi_query=N'', 
    @job_id=N'00000000-0000-0000-0000-000000000000'
GO
EXEC msdb.dbo.sp_update_notification @alert_name=N'Alert DBA on custom errors', @operator_name=N'My Operator', @notification_method = 1
GO

Pour votre commodité, si vous essayez de recréer mon problème, cela vous aidera à déposer de Sys.Messages:

sp_dropmessage @msgnum = 50005; 
GO
4
Dan Bowling

Veuillez vous reporter à créer un événement défini par l'utilisateur

Par défaut, les messages de sévérité définis par l'utilisateur inférieur à 19 ne sont pas envoyés au journal de l'application Microsoft Windows lorsqu'ils se produisent. Les messages de sévérité définis par l'utilisateur inférieur à 19 ne déclenchent donc pas d'alertes d'agent SQL Server.

Donc, votre message devrait être

EXEC sp_addmessage @msgnum = 50005,
      @severity = 1,  -- Informational messages that return status information or report errors that are not severe. The Database Engine does not raise system errors with severities of 0 through 9.
      @msgtext = N'%s';
GO

Lorsque vous utilisez THROW , il est par défaut à la gravité 16 qui ne déclenche pas l'alerte.

RAISERROR (50005, -- Message id.
       1, -- Severity,
       1, -- State,
       N'My custom message') with log;

USE [msdb]
GO

/****** Object:  Alert [Alert DBA on custom errors]    Script Date: 1/22/2016 3:17:22 PM ******/
EXEC msdb.dbo.sp_add_alert @name=N'Alert DBA on custom errors', 
        @message_id=50005, 
        @severity=0, 
        @enabled=1, 
        @delay_between_responses=0, 
        @include_event_description_in=0, 
        @database_name=N'AdventureWorks2012_test', 
        @category_name=N'[Uncategorized]', 
        @job_id=N'00000000-0000-0000-0000-000000000000'
GO

enter image description here

Aussi, assurez-vous d'utiliser @delay_between_responses à une valeur sensible de sorte que votre boîte de réception n'est pas inondée d'emails.

Aussi, reportez-vous à ma réponse pour Surveillance de l'espace libre dans les fichiers de données SQL Server Utilisation du message défini par l'utilisateur et des alertes.

4
Kin Shah

L'ajout de "avec log" à votre relevé RoisError fera l'incendie de l'alerte.

RAISERROR (50005, -- Message id.
       16, -- Severity,
       1, -- State,
       N'My custom message') WITH LOG;

vous aurez besoin de sysadmin ou d'alter Trace à utiliser avec le journal ( https://msdn.microsoft.com/en-us/library/ms178592.aspx )

0
Bob Klimes