カスタムエラーメッセージをスローしたときにオペレーターに通知されるようにしたい。私の理解では、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
RAISERROR
とTHROW
の両方から期待どおりに次の出力が得られます。
メッセージ50005、レベル16、状態1、行68私のカスタムメッセージ
ただし、アラートの履歴を表示すると、アラートがトリガーされていないことが示され、オペレーターは更新メールを受け取りません。
エージェントアラートは次のようになります。
アラートをスクリプト化すると、以下が生成されます。
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
参照してください ユーザー定義イベントの作成
デフォルトでは、重大度が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
また、@delay_between_responses
を適切な値に設定して、受信トレイがメールでいっぱいにならないようにします。
また、ユーザー定義のメッセージとアラートを使用して、 SQL Serverデータファイルの空き領域を監視 について私の回答を参照してください。
レイザーステートメントに「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またはトレースを変更する必要があります