アクティブ化ストアド プロシージャのトラブルシューティング
アクティブ化ストアド プロシージャはバックグラウンド セッションで実行されます。したがって、アクティブ化ストアド プロシージャのトラブルシューティングのテクニックは、対話型セッションの一部であるストアド プロシージャのトラブルシューティングで使用されるテクニックとは多少異なります。
テクニック: アクティブ化ストアド プロシージャの出力を表示する
データベース エンジン は、アクティブ化ストアド プロシージャの出力を SQL Server のエラー ログに書き込みます。アクティブ化ストアド プロシージャで正しくない結果が生成される場合や、キューからの読み取りに失敗する場合は、SQL Server のエラー ログでプロシージャからの出力を確認します。たいていは、このストアド プロシージャの出力から、問題を特定するのに十分な情報が得られます。
テクニック: 対話型セッションからストアド プロシージャを実行する
アクティブ化ストアド プロシージャのトラブルシューティングで最も有効な方法の 1 つは、キューでアクティブ化をオフにして、SQL Server Management Studio (または sqlcmd ユーティリティ) からストアド プロシージャを実行する方法です。対話型セッションからストアド プロシージャを実行すると、ストアド プロシージャによって返されるエラーを確認できます。
ただし、ストアド プロシージャがデータベース エンジン によってアクティブ化されるときには、データベースの設定やセキュリティ コンテキストが異なる可能性があります。プロシージャを実行する前に EXECUTE AS を使用して、セッションのユーザーをアクティブ化のために指定されているユーザーに設定し、セッションのオプションをデータベースの既定値に設定します。
詳細については、「内部アクティブ化のコンテキスト」を参照してください。
現象: アクティブ化ストアド プロシージャが実行されない
この現象の一般的な原因はいくつかあります。
キューの設定が変更された可能性があります。カタログ ビュー sys.service_queues を使用して、キューの設定を確認してください。特に、アクティブ化が有効になっていること、正しいストアド プロシージャが指定されていること、および正しいセキュリティ プリンシパルが指定されていることを確認します。セキュリティ プリンシパルにストアド プロシージャの実行権限があることも確認します。
ストアド プロシージャが開始に失敗しているか、開始した直後に終了している可能性があります。この場合は、SQL Server のエラー ログで、ストアド プロシージャのエラーがないかどうかを確認します。SQL Server Management Studio からストアド プロシージャを実行して結果を確認することもできます。
現象: メッセージがキューに残っている
アクティブ化ストアド プロシージャが正常に開始されていることを確認します。
- 動的管理ビュー sys.dm_broker_queue_monitors で、キュー モニタがキューに対してアクティブになっていることを確認します。アクティブになっていない場合、そのキューではアクティブ化がオンになっていません。ALTER QUEUE ステートメントを使用してアクティブ化をオンにします。
- キューのキュー モニタの状態が RECEIVES_OCCURRING になっている必要があります。キュー モニタがこの状態になっていない場合は、動的管理ビュー sys.dm_broker_activated_tasks で、キューのアクティブなタスクが現在実行されていることを確認します。アクティブなタスクがない場合は、アクティブ化が失敗しています。このセクションの「現象: アクティブ化ストアド プロシージャが実行されない」を参照してください。
アクティブなタスクが実行されているのにメッセージがキューに残っている場合は、そのタスクが RECEIVE に失敗しているか、トランザクションのコミットに失敗しています。SQL Server のエラー ログで、そのストアド プロシージャからのエラーがないかどうかを確認してください。このほか、アクティブ化を停止してストアド プロシージャを手動で実行することも、この問題のトラブルシューティングに役立ちます。
参照
その他の技術情報
sys.service_queues (Transact-SQL)
sys.dm_broker_queue_monitors
sys.dm_broker_activated_tasks