Share via


内部アクティブ化のコンテキスト

このトピックでは、内部アクティブ化によって開始されたストアド プロシージャの実行コンテキストについて説明します。

セキュリティ コンテキスト

アクティブ化用に構成されたキューでは、アクティブ化ストアド プロシージャを実行するユーザーも指定する必要があります。SQL Server では、そのユーザーの権限を借用してストアド プロシージャが開始されます。

ストアド プロシージャで EXECUTE AS 句も指定している場合は、権限の借用が 2 回行われます。まず、SQL Server でキューに対して指定されたユーザーの権限が借用され、ストアド プロシージャが実行されます。ストアド プロシージャが実行されると、そのストアド プロシージャの EXECUTE AS 句で指定されているユーザーの権限が、そのストアド プロシージャによって借用されます。

一般に、リモート サービス バインドに指定されたユーザーは、アクティブ化に指定されたユーザーとは異なるユーザーであることに注意してください。各ユーザーに必要な権限も異なります。リモート サービス バインドに指定されたユーザーには、キューからの読み取り権限やデータベース内のストアド プロシージャの実行権限は不要です。一方、アクティブ化に指定されたユーザーには、メッセージをサービスに送信する権限が不要です。ユーザー権限の詳細については、「ID およびアクセス制御 (Service Broker)」および「Service Broker ダイアログ セキュリティ」を参照してください。

セッションの設定

Service Broker は、メッセージを作成した接続とは異なるバックグラウンド セッションで、内部的にアクティブ化されたサービス プログラムを実行します。このセッションに設定されるオプションは、データベースの既定のオプションです。

Service Broker によって開始されたセッションで、SQL Server により、PRINT ステートメントと RAISERROR ステートメントの出力が SQL Server エラー ログに書き込まれます。アクティブ化されたストアド プロシージャには、Service Broker からパラメータが指定されません。Service Broker では、アクティブ化されたストアド プロシージャから戻り値が渡されないと想定されます。また、アクティブ化されたストアド プロシージャで生成された結果セットも処理されません。

トランザクション コンテキスト

アクティブ化されたストアド プロシージャには、トランザクションを管理する役割があります。SQL Server では、ストアド プロシージャをアクティブ化する前にトランザクションが開始されることはないので、ストアド プロシージャはそのストアド プロシージャをアクティブにする内部操作とは異なるトランザクション コンテキストで実行されます。アクティブ化されたストアド プロシージャでのトランザクションの管理の詳細については、「トランザクション メッセージング」を参照してください。

エラーの検出

アクティブ化されたストアド プロシージャでは、そのストアド プロシージャをアクティブにしたキューからメッセージを受信する必要があります。ストアド プロシージャがメッセージを受信しないで終了したり、短時間のタイムアウト後にストアド プロシージャがメッセージを受信していないことがキュー モニタで検出されると、キュー モニタではストアド プロシージャでエラーが発生したと判断されます。この場合、キュー モニタによりストアド プロシージャのアクティブ化が停止されます。