web-dev-qa-db-ja.com

SQL Server 2012のカスタムエラーメッセージでSQLエージェントアラートを作成するにはどうすればよいですか?

カスタムエラーメッセージをスローしたときにオペレーターに通知されるようにしたい。私の理解では、sys.messagesにメッセージを追加する必要があるということです。その場合、そのエラーIDをRAISERRORまたはTHROWのどちらかにすることができます。メッセージIDでアラートを作成し、それをオペレーターに送信するように設定すると、これらの通知が作成されます。

50005というメッセージIDでSQLエージェントアラートを作成し、次のT-SQLを使用してメッセージを作成しています。

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

次に、これを実行すると:

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

RAISERRORTHROWの両方から期待どおりに次の出力が得られます。

メッセージ50005、レベル16、状態1、行68私のカスタムメッセージ

ただし、アラートの履歴を表示すると、アラートがトリガーされていないことが示され、オペレーターは更新メールを受け取りません。

エージェントアラートは次のようになります。

Agent Alert Setup

アラートをスクリプト化すると、以下が生成されます。

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

あなたの便宜上、私の問題を再現しようとすると、sys.messagesから抜けるのに役立ちます:

sp_dropmessage @msgnum = 50005; 
GO
4
Dan Bowling

参照してください ユーザー定義イベントの作成

デフォルトでは、重大度が19未満のユーザー定義メッセージは、発生時にMicrosoft Windowsアプリケーションログに送信されません。 19未満の重大度のユーザー定義メッセージは、SQL Serverエージェントアラートをトリガーしません。

だからあなたのメッセージは

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

THROW を使用すると、デフォルトでは重大度16になり、アラートは発生しません。

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

また、@delay_between_responsesを適切な値に設定して、受信トレイがメールでいっぱいにならないようにします。

また、ユーザー定義のメッセージとアラートを使用して、 SQL Serverデータファイルの空き領域を監視 について私の回答を参照してください。

4
Kin Shah

レイザーステートメントに「with log」を追加すると、アラートが発生します。

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

log( https://msdn.Microsoft.com/en-us/library/ms178592.aspx )で使用するには、sysadminまたはトレースを変更する必要があります

0
Bob Klimes