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.
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 führt einen bitweisen Vergleich mit der target_service_name-Zeichenfolge aus. 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() ;
Hinweis Diese Option ist in einer enthaltenen Datenbank nicht verfügbar.
'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 Microsoft SQL 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 ist und für den target_service_name eine Remotedienstbindung konfiguriert ist, wird Verschlüsselung verwendet. Andernfalls werden Nachrichten unverschlüsselt gesendet. Ist diese Klausel nicht vorhanden, ist die Standardeinstellung ON.Hinweis 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 muss nicht BEGIN DIALOG CONVERSATION aufrufen. Service Broker erstellt eine Konversation in der Zieldatenbank, wenn die erste Nachricht in der Konversation vom Initiator eintrifft.
Durch das Erstellen eines Dialogs wird ein Konversationsendpunkt für den initiierenden Dienst in der Datenbank erstellt, jedoch wird keine Netzwerkverbindung mit der Instanz erstellt, die den Zieldienst hostet. Service Broker stellt erst die Kommunikation mit dem Ziel des Dialogs her, wenn die erste Nachricht gesendet wird.
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.Starten 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.Starten 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.Starten eines Dialogs mit einer bestimmten Brokerinstanz
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.Starten eines Dialogs und Zuordnen des Dialogs zu 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.Starten eines Dialogs mit einer expliziten Lebensdauer und Zuordnen des Dialogs zu 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.Starten 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 ;
Siehe auch
Verweis
BEGIN CONVERSATION TIMER (Transact-SQL)
END CONVERSATION (Transact-SQL)