次の方法で共有


アクティブ化ストアド プロシージャのトラブルシューティング

アクティブ化ストアド プロシージャはバックグラウンド セッションで実行されます。したがって、アクティブ化ストアド プロシージャのトラブルシューティングのテクニックは、対話型セッションの一部であるストアド プロシージャのトラブルシューティングで使用されるテクニックとは多少異なります。

テクニック: Service Broker の構成を分析する

アクティブ化ストアド プロシージャの実行に失敗した場合は、ssbdiagnose ユーティリティを使用して、関連するサービスに構成エラーがないかどうか確認します。詳細については、「ssbdiagnose ユーティリティ」を参照してください。

テクニック: アクティブ化ストアド プロシージャの出力を表示する

アクティブ化ストアド プロシージャで不適切な結果が返されたり、キューからの読み取りが行われない場合は、SQL Server エラー ログで、問題の特定に役立つエラーやメッセージを確認します。アクティブ化ストアド プロシージャはアプリケーションに関連付けられていません。通常、呼び出し元のアプリケーションに返される情報は、SQL Server エラー ログに記録されます。エラー ログには、エラー、メッセージ、および PRINT ステートメントや RAISERROR ステートメントの出力が含まれます。

テクニック: 対話型セッションからストアド プロシージャを実行する

アクティブ化ストアド プロシージャのトラブルシューティングを行う場合、キューでアクティブ化をオフにして、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 のエラー ログで、そのストアド プロシージャからのエラーがないかどうかを確認してください。このほか、アクティブ化を停止してストアド プロシージャを手動で実行することも、この問題のトラブルシューティングに役立ちます。