BEGIN DIALOG CONVERSATION (Transact-SQL)

Beginnt einen Dialog zwischen zwei Diensten. Ein Dialog ermöglicht eine Konversation zwischen zwei Diensten, bei der jede Nachricht genau einmal übertragen wird, und zwar an der Reihenfolgeposition, an der sie gesendet wird.

Themenlink (Symbol)Transact-SQL-Syntaxkonventionen

Syntax

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 }  ] ]
[ ; ]

Argumente

  • **@**dialog_handle
    Eine Variable, die zum Speichern des systemgenerierten Dialoghandles für den neuen Dialog verwendet wird, der von der BEGIN DIALOG CONVERSATION-Anweisung zurückgegeben wird. Die Variable muss den Datentyp uniqueidentifier haben.

  • FROM SERVICE initiator_service_name
    Gibt den Dienst an, der den Dialog initialisiert. Bei dem angegebenen Namen muss es sich um den Namen eines Diensts in der aktuellen Datenbank handeln. Die als Initiatordienst angegebene Warteschlange empfängt Nachrichten, die vom Zieldienst zurückgegeben werden, sowie Nachrichten, die von Service Broker für diese Konversation erstellt wurden.

  • TO SERVICE 'target_service_name'
    Gibt den Zieldienst an, mit dem der Dialog initialisiert werden soll. target_service_name ist vom Datentyp nvarchar(256). Service Broker verwendet einen Vergleich auf Byteebene, um eine Übereinstimmung für die Zeichenfolge target_service_name festzustellen. Das heißt, dass bei dem Vergleich die Groß- und Kleinschreibung beachtet und die aktuelle Sortierung nicht berücksichtigt wird.

  • service_broker_guid
    Gibt die Datenbank an, auf der sich der Zieldienst befindet. Wenn mehrere Datenbanken eine Instanz des Zieldiensts hosten, können Sie mit einer bestimmten Datenbank kommunizieren, indem Sie service_broker_guid angeben.

    service_broker_guid ist ein nvarchar(128)-Typ. Um service_broker_guid für eine Datenbank zu ermitteln, führen Sie in der Datenbank die folgende Abfrage aus:

    SELECT service_broker_guid
    FROM sys.databases
    WHERE database_id = DB_ID() ;
    

    Weitere Informationen zur Service Broker-Identität finden Sie unter Verwalten von Service Broker-Identitäten.

  • 'CURRENT DATABASE'
    Gibt an, dass die Konversation für die aktuelle Datenbank service_broker_guid verwendet.

  • ON CONTRACT contract_name
    Gibt den Vertrag an, dem diese Konversation entspricht. Der Vertrag muss in der aktuellen Datenbank vorhanden sein. Wenn der Zieldienst für den angegebenen Vertrag keine neuen Konversationen akzeptiert, gibt Service Broker eine Fehlermeldung zur Konversation zurück. Wird diese Klausel weggelassen, folgt die Konversation dem Vertrag mit dem Namen DEFAULT.

  • RELATED_CONVERSATION **=**related_conversation_handle
    Gibt die vorhandene Konversationsgruppe an, der der neue Dialog hinzugefügt wird. Wenn diese Klausel vorhanden ist, gehört der neue Dialog derselben Konversationsgruppe an, wie der Dialog, der mit related_conversation_handle angegeben wird. related_conversation_handlemuss ein Datentyp sein, der implizit in den Typ uniqueidentifier konvertiert werden kann. Die Anweisung erzeugt einen Fehler, wenn related_conversation_handle nicht auf einen vorhandenen Dialog verweist.

  • RELATED_CONVERSATION_GROUP **=**related_conversation_group_id
    Gibt die vorhandene Konversationsgruppe an, der der neue Dialog hinzugefügt wird. Wenn diese Klausel vorhanden ist, wird der neue Dialog derselben Konversationsgruppe hinzugefügt, die mit related_conversation_group_id angegeben wird. related_conversation_group_idmuss ein Datentyp sein, der implizit in den Typ uniqueidentifier konvertiert werden kann. Wenn related_conversation_group_idnicht auf eine vorhandene Konversationsgruppe verweist, dann legt Service Broker eine neue Konversationsgruppe mit dem angegebenen Wert für related_conversation_group_id an und verknüpft den neuen Dialog mit dieser Konversationsgruppe.

  • LIFETIME **=**dialog_lifetime
    Gibt den maximalen Zeitraum an, in dem der Dialog geöffnet bleibt. Damit der Dialog erfolgreich abgeschlossen wird, müssen beide Endpunkte den Dialog explizit beenden, bevor die Lebensdauer abläuft. Der Wert für dialog_lifetime muss in Sekunden angegeben werden. Lifetime ist vom Datentyp int. Wird keine LIFETIME-Klausel angegeben, entspricht die Lebensdauer des Dialogs dem maximalen Wert des Datentyps int.

  • ENCRYPTION
    Gibt an, ob Nachrichten, die über diesen Dialog versandt und empfangen werden, verschlüsselt werden müssen, wenn sie außerhalb einer Instanz von MicrosoftSQL Server versandt werden. Ein Dialog, der verschlüsselt werden muss, ist ein sicherer Dialog. Wenn ENCRYPTION = ON festgelegt wurde und wenn die für die Verschlüsselung erforderlichen Zertifikate nicht konfiguriert sind, gibt Service Broker für die Konversation eine Fehlermeldung zurück. Wenn ENCRYPTION = OFF festgelegt ist, wird die Verschlüsselung nur dann verwendet, wenn eine Remotedienstbindung für target_service_name konfiguriert ist; andernfalls werden Nachrichten unverschlüsselt versandt. Ist diese Klausel nicht vorhanden, ist die Standardeinstellung ON. Weitere Informationen zur Sicherheit bei Dialogen finden Sie unter Service Broker-Dialogsicherheit.

    HinweisHinweis

    Nachrichten, die mit Diensten in derselben Instanz von SQL Server ausgetauscht werden, sind nie verschlüsselt. Jedoch sind ein Hauptschlüssel für die Datenbank und die Zertifikate für die Verschlüsselung für diejenigen Konversationen mit Verschlüsselung erforderlich, bei denen sich die Dienste für die Konversation auf verschiedenen Datenbanken befinden. Damit kann die Konversation auch dann fortgesetzt werden, wenn während der Ausführung der Konversation eine der Datenbanken auf eine andere Instanz verschoben wird.

Hinweise

Alle Nachrichten sind Teil einer Konversation. Deshalb muss ein initialisierender Dienst eine Konversation mit dem Zieldienst beginnen, bevor eine Nachricht an den Zieldienst gesandt wird. Die in der BEGIN DIALOG CONVERSATION-Anweisung angegebenen Informationen sind mit der Adresse auf einem Brief vergleichbar; Service Broker verwendet diese Informationen, um Nachrichten an den richtigen Dienst zu übermitteln. Der Dienst, der in der TO SERVICE-Klausel angegeben wird, ist die Adresse, an die die Nachrichten gesandt werden. Der Dienst, der in der FROM SERVICE-Klausel angegeben wird, ist die Rückadresse für Antwortnachrichten.

Das Ziel einer Konversation braucht nicht BEGIN DIALOG CONVERSATION aufzurufen. Service Broker erstellt eine Konversation in der Zieldatenbank, wenn die erste Nachricht der Konversation vom Initiator eintrifft.

Wird ein Dialog begonnen, wird damit ein Konversationsendpunkt in der Datenbank für den initiierenden Dienst angelegt. Es wird aber keine Netzwerkverbindung mit der Instanz hergestellt, die den Zieldienst hostet. Service Broker richtet erst dann die Kommunikation mit dem Ziel des Dialogs ein, wenn die erste Nachricht versandt wurde.

Wenn die BEGIN DIALOG CONVERSATION-Anweisung keine verknüpfte Konversation oder verknüpfte Konversationsgruppe angibt, legt Service Broker für die neue Konversation eine neue Konversationsgruppe an.

Service Broker lässt für Konversationen keine beliebigen Gruppierungen zu. Für alle Konversationen in einer Konversationsgruppe muss der Dienst in der FROM-Klausel entweder als Initiator oder als Ziel der Konversation angegeben werden.

Mit dem BEGIN DIALOG CONVERSATION-Befehl wird die Konversationsgruppe gesperrt, die das zurückgegebene dialog_handle enthält. Wenn der Befehl eine RELATED_CONVERSATION_GROUP-Klausel umfasst, dann ist die Konversationsgruppe für dialog_handle die Konversationsgruppe, die im related_conversation_group_id-Parameter angegeben ist. Wenn der Befehl eine RELATED_CONVERSATION-Klausel umfasst, dann ist die Konversationsgruppe für dialog_handle die Konversationsgruppe, die mit dem angegebenen Wert für related_conversation_handle verknüpft ist.

BEGIN DIALOG CONVERSATION ist in einer benutzerdefinierten Funktion nicht gültig.

Berechtigungen

Um einen Dialog zu beginnen, muss der aktuelle Benutzer eine RECEIVE-Berechtigung für die Warteschlange für den Dienst haben, der in der FROM-Klausel des Befehls angegeben wird. Außerdem muss er über die Berechtigung REFERENCES für den angegebenen Vertrag verfügen.

Beispiele

A. Beginnen eines Dialogs

Im folgenden Beispiel wird eine Dialogkonversation begonnen, und ein Bezeichner für den Dialog wird in @dialog\_handle. gespeichert. Der Dienst //Adventure-Works.com/ExpenseClient ist der Initiator für den Dialog, und der Dienst //Adventure-Works.com/Expenses ist das Ziel des Dialogs. Der Dialog entspricht dem Vertrag //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. Beginnen eines Dialogs mit einer expliziten Lebensdauer

Im folgenden Beispiel wird eine Dialogkonversation begonnen, und ein Bezeichner für den Dialog wird in @dialog\_handle gespeichert. Der Dienst //Adventure-Works.com/ExpenseClient ist der Initiator für den Dialog, und der Dienst //Adventure-Works.com/Expenses ist das Ziel des Dialogs. Der Dialog entspricht dem Vertrag //Adventure-Works.com/Expenses/ExpenseSubmission. Wenn der Dialog nicht innerhalb von 60 Sekunden mit dem Befehl END CONVERSATION geschlossen wird, beendet Service Broker den Dialog mit einem Fehler.

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. Beginnen eines Dialogs mit einer bestimmten Broker-Instanz

Im folgenden Beispiel wird eine Dialogkonversation begonnen, und ein Bezeichner für den Dialog wird in @dialog\_handle gespeichert. Der Dienst //Adventure-Works.com/ExpenseClient ist der Initiator für den Dialog, und der Dienst //Adventure-Works.com/Expenses ist das Ziel des Dialogs. Der Dialog entspricht dem Vertrag //Adventure-Works.com/Expenses/ExpenseSubmission. Service Broker leitet Nachrichten für diesen Dialog an den Broker weiter, der über folgenden GUID angegeben wird: 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. Beginnen eines Dialogs, und Verknüpfen des Dialogs mit einer vorhandenen Konversationsgruppe

Im folgenden Beispiel wird eine Dialogkonversation begonnen, und ein Bezeichner für den Dialog wird in @dialog\_handle gespeichert. Der Dienst //Adventure-Works.com/ExpenseClient ist der Initiator für den Dialog, und der Dienst //Adventure-Works.com/Expenses ist das Ziel des Dialogs. Der Dialog entspricht dem Vertrag //Adventure-Works.com/Expenses/ExpenseSubmission. Service Broker verknüpft den Dialog mit der durch @conversation\_group\_id angegebenen Konversationsgruppe, statt eine neue Konversationsgruppe zu erstellen.

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. Beginnen eines Dialogs mit einer expliziten Lebensdauer, und Herstellen einer Verbindung für den Dialog mit einer vorhandenen Konversation

Im folgenden Beispiel wird eine Dialogkonversation begonnen, und ein Bezeichner für den Dialog wird in @dialog\_handle gespeichert. Der Dienst //Adventure-Works.com/ExpenseClient ist der Initiator für den Dialog, und der Dienst //Adventure-Works.com/Expenses ist das Ziel des Dialogs. Der Dialog entspricht dem Vertrag //Adventure-Works.com/Expenses/ExpenseSubmission. Der neue Dialog gehört der gleichen Konversationsgruppe an, zu der @existing\_conversation\_handle gehört. Wenn der Dialog nicht innerhalb von 600 Sekunden mit dem Befehl END CONVERSATION geschlossen wird, beendet Service Broker den Dialog mit einem Fehler.

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. Beginnen eines Dialogs mit optionaler Verschlüsselung

Im folgenden Beispiel wird eine Dialogkonversation begonnen, und ein Bezeichner für den Dialog wird in @dialog\_handle gespeichert. Der Dienst //Adventure-Works.com/ExpenseClient ist der Initiator für den Dialog, und der Dienst //Adventure-Works.com/Expenses ist das Ziel des Dialogs. Der Dialog entspricht dem Vertrag //Adventure-Works.com/Expenses/ExpenseSubmission. Die Konversation in diesem Beispiel lässt es zu, dass die Nachricht unverschlüsselt über das Netzwerk weitergeleitet wird, wenn die Verschlüsselung nicht verfügbar ist.

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 ;