BEGIN DIALOG CONVERSATION (Transact-SQL)
あるサービスから別のサービスに対してダイアログを開始します。ダイアログとは、2 つのサービスの間で順序どおりにメッセージを 1 回だけ交換する (exactly-once-in-order) メッセージ交換のことです。
構文
BEGIN DIALOG [ CONVERSATION ] @dialog_handle FROM SERVICE initiator_service_name TO SERVICE 'target_service_name' [ , { 'service_broker_guid' | 'CURRENT DATABASE' } ] [ ON CONTRACT contract_name ] [ WITH [ { RELATED_CONVERSATION = related_conversation_handle | RELATED_CONVERSATION_GROUP = related_conversation_group_id } ] [ [ , ] LIFETIME = dialog_lifetime ] [ [ , ] ENCRYPTION = { ON | OFF } ] ] [ ; ]
引数
- **@**dialog_handle
システムで生成される、新しいダイアログ用のダイアログ ハンドルを格納する変数です。この値は、BEGIN DIALOG CONVERSATION ステートメントによって返されます。この変数のデータ型は、uniqueidentifier であることが必要です。
- FROM SERVICE initiator_service_name
ダイアログを開始するサービスを指定します。現在のデータベースにあるサービスの名前を指定する必要があります。発信先サービスから返されるメッセージ、およびこのメッセージ交換用に Service Broker によって作成されるメッセージは、発信側サービス用に指定したキューで受信されます。
- TO SERVICE 'target_service_name'
ダイアログの発信先となるサービスを指定します。target_service_name のデータ型は nvarchar(256) です。Service Broker は target_service_name 文字列をバイト単位で照合します。つまり、この場合、大文字小文字は区別され、現在の照合順序は考慮されません。
service_broker_guid
発信先サービスをホストするデータベースを指定します。発信先サービスの 1 つのインスタンスが複数のデータベースでホストされる場合に、特定のデータベースと通信するには、service_broker_guid を指定します。service_broker_guid のデータ型は nvarchar(128) です。データベースの service_broker_guid を特定するには、データベースで次のクエリを実行します。
SELECT service_broker_guid FROM sys.databases WHERE database_id = DB_ID() ;
Service Broker ID の詳細については、「Service Broker の ID の管理」を参照してください。
- 'CURRENT DATABASE'
メッセージ交換で現在のデータベースの service_broker_guid を使用することを指定します。
- ON CONTRACT contract_name
メッセージ交換が従うコントラクトを指定します。コントラクトは、現在のデータベース内に存在している必要があります。発信先サービスで、指定したコントラクトに従った新しいメッセージ交換が受け入れられない場合、Service Broker ではそのメッセージ交換に関するエラー メッセージが返されます。この句を省略すると、メッセージ交換は DEFAULT というコントラクトに従います。
- RELATED_CONVERSATION **=**related_conversation_handle
新しいダイアログを追加する既存のメッセージ交換グループを指定します。この句を指定すると、新しいダイアログは、related_conversation_handle で指定したダイアログと同じメッセージ交換グループに属することになります。related_conversation_handle のデータ型は、uniqueidentifier に暗黙的に変換できるデータ型であることが必要です。related_conversation_handle が既存のダイアログを参照していない場合、ステートメントは失敗します。
- RELATED_CONVERSATION_GROUP **=**related_conversation_group_id
新しいダイアログを追加する既存のメッセージ交換グループを指定します。この句を指定すると、新しいダイアログは、related_conversation_group_id で指定したメッセージ交換グループに追加されます。related_conversation_group_id のデータ型は、uniqueidentifier に暗黙的に変換できるデータ型であることが必要です。related_conversation_group_id が既存のメッセージ交換グループを参照していない場合、Service Broker では、指定した related_conversation_group_id で新しいメッセージ交換グループが作成され、そのメッセージ交換グループに新しいダイアログが関連付けられます。
- LIFETIME **=**dialog_lifetime
ダイアログを開いたままにする最長時間を指定します。ダイアログを正常に完了するには、有効期間の終了までに、双方のエンドポイントが明示的にダイアログを終了する必要があります。dialog_lifetime の値は秒単位で指定する必要があります。LIFETIME のデータ型は int です。LIFETIME 句を指定しない場合、ダイアログの有効期間は int データ型の最大値になります。
ENCRYPTION
このダイアログで受送信したメッセージを Microsoft SQL Server インスタンスの外部に送信する場合に、メッセージを暗号化するかどうかを指定します。暗号化が必要なダイアログは、セキュリティで保護されたダイアログです。ENCRYPTION = ON にした場合で、暗号化のサポートに必要な証明書が構成されていない場合は、Service Broker によってメッセージ交換に関するエラー メッセージが返されます。ENCRYPTION = OFF にすると、target_service_name に対してリモート サービス バインドが構成されている場合はメッセージが暗号化され、それ以外の場合はメッセージが暗号化されずに送信されます。この句を指定しない場合、既定値の ON が使用されます。ダイアログ セキュリティの詳細については、「Service Broker ダイアログ セキュリティ」を参照してください。メモ : 同じ SQL Server インスタンスにあるサービス間で交換されるメッセージは暗号化されません。ただし、メッセージ交換を行うサービスが異なるデータベースにある場合は、暗号化したメッセージ交換を行うために、データベースのマスタ キーと暗号化の証明書が必要になります。これらを用意しておくと、メッセージ交換中にデータベースの 1 つが別のインスタンスに移動した場合でも、メッセージ交換を続行できます。
解説
すべてのメッセージはメッセージ交換の一部になります。したがって、発信先サービスにメッセージを送信するには、発信側サービスで、発信先サービスとのメッセージ交換を開始する必要があります。BEGIN DIALOG CONVERSATION ステートメントで指定する情報は、手紙の住所と同じで、Service Broker ではこの情報を使って正しいサービスにメッセージを配信します。TO SERVICE 句で指定するサービスは、メッセージの送信先アドレスです。FROM SERVICE 句で指定するサービスは、メッセージの返信先アドレスです。
メッセージ交換の発信先で BEGIN DIALOG CONVERSATION を呼び出す必要はなく、Service Broker によって発信先データベースにメッセージ交換が作成されます。
ダイアログを開始すると、発信側サービスのデータベースにメッセージ交換のエンドポイントは作成されますが、発信先サービスをホストしているインスタンスへのネットワーク接続は作成されません。最初のメッセージが送信されるまでは、Service Broker でダイアログの発信先との通信は確立されません。
BEGIN DIALOG CONVERSATION ステートメントで、関連するメッセージ交換またはメッセージ交換グループを指定しなかった場合は、Service Broker によって、新しいメッセージ交換用の新しいメッセージ交換グループが作成されます。
Service Broker では、メッセージ交換のグループ化を任意に行うことはできません。メッセージ交換グループのすべてのメッセージ交換に対しては、FROM 句を使って、メッセージ交換の発信側または発信先のサービスを指定する必要があります。
BEGIN DIALOG CONVERSATION コマンドを実行すると、返された dialog_handle が含まれているメッセージ交換グループがロックされます。コマンドに RELATED_CONVERSATION_GROUP 句を指定した場合、dialog_handle のメッセージ交換グループは、related_conversation_group_id パラメータで指定したメッセージ交換グループになります。コマンドに RELATED_CONVERSATION 句を指定した場合、dialog_handle のメッセージ交換グループは、指定した related_conversation_handle に関連付けられているメッセージ交換グループになります。
BEGIN DIALOG CONVERSATION は、ユーザー定義の関数では無効です。
権限
ダイアログを開始するには、現在のユーザーに、コマンドの FROM 句で指定したサービス用のキューに対する RECEIVE 権限と、指定したコントラクトの REFERENCES 権限が与えられている必要があります。
例
A. ダイアログを開始する
次の例では、ダイアログ メッセージ交換を開始し、@dialog_handle
にダイアログの識別子を格納します。//Adventure-Works.com/ExpenseClient
サービスはダイアログの発信側で、//Adventure-Works.com/Expenses
サービスはダイアログの発信先です。このダイアログはコントラクト //Adventure-Works.com/Expenses/ExpenseSubmission
に従います。
DECLARE @dialog_handle UNIQUEIDENTIFIER ;
BEGIN DIALOG CONVERSATION @dialog_handle
FROM SERVICE [//Adventure-Works.com/ExpenseClient]
TO SERVICE '//Adventure-Works.com/Expenses'
ON CONTRACT [//Adventure-Works.com/Expenses/ExpenseSubmission] ;
B. 有効期間を明示してダイアログを開始する
次の例では、ダイアログ メッセージ交換を開始し、@dialog_handle
にダイアログの識別子を格納します。//Adventure-Works.com/ExpenseClient
サービスはダイアログの発信側で、//Adventure-Works.com/Expenses
サービスはダイアログの発信先です。このダイアログはコントラクト //Adventure-Works.com/Expenses/ExpenseSubmission
に従います。60
秒以内に END CONVERSATION コマンドを使ってダイアログを閉じなかった場合は、ブローカによってダイアログが終了され、エラーが返されます。
DECLARE @dialog_handle UNIQUEIDENTIFIER ;
BEGIN DIALOG CONVERSATION @dialog_handle
FROM SERVICE [//Adventure-Works.com/ExpenseClient]
TO SERVICE '//Adventure-Works.com/Expenses'
ON CONTRACT [//Adventure-Works.com/Expenses/ExpenseSubmission]
WITH LIFETIME = 60 ;
C. 特定のブローカ インスタンスとのダイアログを開始する
次の例では、ダイアログ メッセージ交換を開始し、@dialog_handle
にダイアログの識別子を格納します。//Adventure-Works.com/ExpenseClient
サービスはダイアログの発信側で、//Adventure-Works.com/Expenses
サービスはダイアログの発信先です。このダイアログはコントラクト //Adventure-Works.com/Expenses/ExpenseSubmission
に従います。ここでは、ブローカによって、このダイアログから GUID a326e034-d4cf-4e8b-8d98-4d7e1926c904.
で指定されたブローカにメッセージがルートされます。
DECLARE @dialog_handle UNIQUEIDENTIFIER ;
BEGIN DIALOG CONVERSATION @dialog_handle
FROM SERVICE [//Adventure-Works.com/ExpenseClient]
TO SERVICE '//Adventure-Works.com/Expenses',
'a326e034-d4cf-4e8b-8d98-4d7e1926c904'
ON CONTRACT [//Adventure-Works.com/Expenses/ExpenseSubmission] ;
D. ダイアログを開始し、そのダイアログを既存のメッセージ交換グループに関連付ける
次の例では、ダイアログ メッセージ交換を開始し、@dialog_handle
にダイアログの識別子を格納します。//Adventure-Works.com/ExpenseClient
サービスはダイアログの発信側で、//Adventure-Works.com/Expenses
サービスはダイアログの発信先です。このダイアログはコントラクト //Adventure-Works.com/Expenses/ExpenseSubmission
に従います。ここでは、ブローカによって、新しいメッセージ交換グループが作成されるのではなく、@conversation_group_id
で指定したメッセージ交換グループにダイアログが関連付けられます。
DECLARE @dialog_handle UNIQUEIDENTIFIER ;
DECLARE @conversation_group_id UNIQUEIDENTIFIER ;
SET @conversation_group_id = <retrieve conversation group ID from database>
BEGIN DIALOG CONVERSATION @dialog_handle
FROM SERVICE [//Adventure-Works.com/ExpenseClient]
TO SERVICE '//Adventure-Works.com/Expenses'
ON CONTRACT [//Adventure-Works.com/Expenses/ExpenseSubmission]
WITH RELATED_CONVERSATION_GROUP = @conversation_group_id ;
E. 有効期間を明示してダイアログを開始し、そのダイアログと既存のメッセージ交換を関連付ける
次の例では、ダイアログ メッセージ交換を開始し、@dialog_handle
にダイアログの識別子を格納します。//Adventure-Works.com/ExpenseClient
サービスはダイアログの発信側で、//Adventure-Works.com/Expenses
サービスはダイアログの発信先です。このダイアログはコントラクト //Adventure-Works.com/Expenses/ExpenseSubmission
に従います。新しいダイアログは、@existing_conversation_handle
が属するメッセージ交換グループと同じメッセージ交換グループに属します。600
秒以内に END CONVERSATION コマンドを使ってダイアログを閉じなかった場合は、Service Broker によってダイアログが終了され、エラーが返されます。
DECLARE @dialog_handle UNIQUEIDENTIFIER
DECLARE @existing_conversation_handle UNIQUEIDENTIFIER
SET @existing_conversation_handle = <retrieve conversation handle from database>
BEGIN DIALOG CONVERSATION @dialog_handle
FROM SERVICE [//Adventure-Works.com/ExpenseClient]
TO SERVICE '//Adventure-Works.com/Expenses'
ON CONTRACT [//Adventure-Works.com/Expenses/ExpenseSubmission]
WITH RELATED_CONVERSATION = @existing_conversation_handle
LIFETIME = 600 ;
F. 暗号化のオプションを指定してダイアログを開始する
次の例では、ダイアログを開始し、@dialog_handle
にダイアログの識別子を格納します。//Adventure-Works.com/ExpenseClient
サービスはダイアログの発信側で、//Adventure-Works.com/Expenses
サービスはダイアログの発信先です。このダイアログはコントラクト //Adventure-Works.com/Expenses/ExpenseSubmission
に従います。この例のメッセージ交換では、暗号化が利用できない場合に、暗号化していないメッセージをネットワークを介して送信できます。
DECLARE @dialog_handle UNIQUEIDENTIFIER
BEGIN DIALOG CONVERSATION @dialog_handle
FROM SERVICE [//Adventure-Works.com/ExpenseClient]
TO SERVICE '//Adventure-Works.com/Expenses'
ON CONTRACT [//Adventure-Works.com/Expenses/ExpenseSubmission]
WITH ENCRYPTION = OFF ;
参照
関連項目
BEGIN CONVERSATION TIMER (Transact-SQL)
END CONVERSATION (Transact-SQL)
MOVE CONVERSATION (Transact-SQL)
sys.conversation_endpoints (Transact-SQL)
その他の技術情報
Service Broker のチュートリアル
メッセージ交換グループ
メッセージ交換グループのロック
ダイアログ メッセージ交換