適用対象:SQL Server
Azure SQL Managed Instance
あるサービスから別のサービスに対してダイアログを開始します。 ダイアログとは、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 型である必要があります。
SERVICEからinitiator_service_name
ダイアログを開始するサービスを指定します。 現在のデータベースにあるサービスの名前を指定する必要があります。 発信先サービスから返されるメッセージ、およびこのメッセージ交換用に Service Broker によって作成されるメッセージは、発信側サービス用に指定したキューで受信されます。
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() ;
Note
このオプションは、包含データベースでは使用できません。
『現在の正 DATABASE』
メッセージ交換で現在のデータベースの service_broker_guid を使用することを指定します。
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 で新しいメッセージ交換グループが作成され、そのメッセージ交換グループに新しいダイアログが関連付けられます。
生涯の大 =dialog_lifetime
ダイアログを開いたままにする最長時間を指定します。 ダイアログを正常に完了するには、有効期間の終了までに、双方のエンドポイントが明示的にダイアログを終了する必要があります。
dialog_lifetime の値は秒単位で表す必要があります。 有効期間は int 型です。LIFETIME 句を指定しない場合、ダイアログの有効期間は int データ型の最大値になります。
ENCRYPTION
このダイアログで送受信したメッセージを Microsoft SQL Server のインスタンスの外部で送信する場合に、このメッセージを暗号化するかどうかを指定します。 暗号化が必要なダイアログは、セキュリティで保護されたダイアログです。 ENCRYPTION = ON の状態で、暗号化のサポートに必要な証明書が構成されていない場合、Service Broker は、メッセージ交換に関するエラー メッセージを返します。 ENCRYPTION = OFF の状態で、target_service_name に対してリモート サービス バインドが構成されている場合は、暗号化が使用されます。それ以外の場合、メッセージは暗号化されずに送信されます。 この句を指定しない場合、既定値の ON が使用されます。
Note
SQL Server の同じインスタンス内にあるサービスとの間で交換されるメッセージは暗号化されません。 ただし、メッセージ交換を行うサービスが異なるデータベースにある場合は、暗号化したメッセージ交換を行うために、データベースのマスター キーと暗号化の証明書が必要になります。 これらを用意しておくと、メッセージ交換中にデータベースの 1 つが別のインスタンスに移動した場合でも、メッセージ交換を続行できます。
注釈
すべてのメッセージはメッセージ交換の一部になります。 したがって、発信先サービスにメッセージを送信するには、発信側サービスで、発信先サービスとのメッセージ交換を開始する必要があります。 BEGIN DIALOG CONVERSATION文に記載されている情報は、手紙の住所に似ています。サービスブローカーはその情報を用いて正しいサービスにメッセージを届けます。 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 に従います。
END CONVERSATIONコマンドで60秒以内にダイアログが閉じられなければ、ブローカーはエラーでダイアログを終了します。
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)