Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op:SQL Server
Azure SQL Managed Instance
Begint een dialoog van de ene dienst naar de andere. Een dialoog is een gesprek dat precies één keer in volgorde boodschap tussen twee diensten biedt.
Transact-SQL syntaxis-conventies
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 } ] ]
[ ; ]
Arguments
@
dialog_handle
Is een variabele die wordt gebruikt om de door het systeem gegenereerde dialooghandle op te slaan voor de nieuwe dialoogdialoog die door de BEGIN DIALOG CONVERSATION instructie wordt teruggegeven. De variabele moet van type uniqueidentifier zijn.
VAN SERVICEinitiator_service_name
Specificeert de service die de dialoog start. De opgegeven naam moet de naam zijn van een dienst in de huidige database. De wachtrij die voor de initiatordienst is gespecificeerd, ontvangt berichten die door de doelservice worden teruggestuurd en berichten die door Service Broker voor dit gesprek zijn aangemaakt.
OM SERVICE'target_service_name'
Specificeert de doelservice waarmee de dialoog gestart moet worden. De target_service_name is van het type nvarchar(256). Service Broker gebruikt een byte-voor-byte vergelijking om de target_service_name string te matchen. Met andere woorden, de vergelijking is hoofdlettergevoelig en houdt geen rekening met de huidige collatie.
service_broker_guid
Specificeert de database die de doeldienst host. Wanneer meer dan één database een instantie van de doeldienst host, kun je communiceren met een specifieke database door een service_broker_guid aan te bieden.
De service_broker_guid is van het type nvarchar(128). Om de service_broker_guid voor een database te vinden, voert u de volgende query uit in de database:
SELECT service_broker_guid
FROM sys.databases
WHERE database_id = DB_ID() ;
Opmerking
Deze optie is niet beschikbaar in een besloten database.
'HUIDIG'DATABASE
Geeft aan dat het gesprek de service_broker_guid gebruikt voor de huidige database.
OP CONTRACTcontract_name
Specificeert het contract dat dit gesprek volgt. Het contract moet bestaan in de huidige database. Als de doeldienst geen nieuwe gesprekken accepteert op het gespecificeerde contract, geeft Service Broker een foutmelding terug bij het gesprek. Wanneer deze clausule wordt weggelaten, volgt het gesprek het contract genaamd DEFAULT.
RELATED_CONVERSATION =related_conversation_handle
Geeft de bestaande gespreksgroep aan waar de nieuwe dialoog aan wordt toegevoegd. Wanneer deze clausule aanwezig is, behoort de nieuwe dialoog tot dezelfde gespreksgroep als de dialoog die door related_conversation_handle is gespecificeerd. De related_conversation_handlemoet van een type zijn dat impliciet omgezet kan worden naar type-uniqueidentifier. De instructie faalt als de related_conversation_handle geen bestaande dialoog verwijst.
RELATED_CONVERSATION_GROUP =related_conversation_group_id
Geeft de bestaande gespreksgroep aan waar de nieuwe dialoog aan wordt toegevoegd. Wanneer deze clausule aanwezig is, wordt de nieuwe dialoog toegevoegd aan de gespreksgroep die door related_conversation_group_id is gespecificeerd. De related_conversation_group_idmoet van een type zijn dat impliciet omgezet kan worden naar type-uniqueidentifier. Als related_conversation_group_idgeen bestaande gespreksgroep aanbeveelt, maakt de servicebroker een nieuwe gespreksgroep aan met de opgegeven related_conversation_group_id en koppelt de nieuwe dialoog aan die gespreksgroep.
LEVENSLANGE =dialog_lifetime
Geeft de maximale tijd aan dat de dialoogkaart open zal blijven. Om de dialoog succesvol te voltooien, moeten beide eindpunten expliciet de dialoog beëindigen voordat de levensduur verloopt. De dialog_lifetime waarde moet in seconden worden uitgedrukt. Levenslang is van het type int. Wanneer er geen LIFETIME clausule is gespecificeerd, is de dialooglevensduur de maximale waarde van het int-datatype .
ENCRYPTION
Specificeert of berichten die in deze dialoog worden verzonden en ontvangen, versleuteld moeten zijn wanneer ze buiten een instantie van Microsoft SQL Server worden verzonden. Een dialoog die versleuteld moet worden, is een beveiligde dialoog. Wanneer ENCRYPTIE = AAN en de certificaten die nodig zijn om encryptie te ondersteunen niet zijn geconfigureerd, geeft Service Broker een foutmelding terug tijdens het gesprek. Als ENCRYPTION = OFF, wordt encryptie gebruikt als een remote service binding is geconfigureerd voor de target_service_name; anders worden berichten onversleuteld verzonden. Als deze clausule niet aanwezig is, is de standaardwaarde AAN.
Opmerking
Berichten die met services in dezelfde instantie van SQL Server worden uitgewisseld, worden nooit versleuteld. Echter, een database-hoofdsleutel en de certificaten voor encryptie zijn nog steeds vereist voor gesprekken die encryptie gebruiken als de diensten voor het gesprek zich in verschillende databases bevinden. Hierdoor kunnen gesprekken doorgaan als een van de databases naar een andere instantie wordt verplaatst terwijl het gesprek gaande is.
Remarks
Alle berichten maken deel uit van een gesprek. Daarom moet een startende dienst een gesprek beginnen met de doeldienst voordat een bericht naar de doeldienst wordt gestuurd. De informatie die in de BEGIN DIALOG CONVERSATION verklaring wordt vermeld, lijkt op het adres op een brief; Service Broker gebruikt de informatie om berichten naar de juiste dienst te sturen. De dienst die in de TO-clausule SERVICE is gespecificeerd, is het adres waarnaar berichten worden gestuurd. De dienst die in de FROM-clausule SERVICE is gespecificeerd, is het retouradres dat wordt gebruikt voor antwoordberichten.
Het doelwit van een gesprek hoeft niet te bellen BEGIN DIALOG CONVERSATION. Service Broker maakt een gesprek aan in de doeldatabase wanneer het eerste bericht in het gesprek van de initiator binnenkomt.
Het starten van een dialoog creëert een conversatie-eindpunt in de database voor de initierende service, maar creëert geen netwerkverbinding met de instantie die de doelservice host. Service Broker legt pas communicatie tot stand met het doelwit van de dialoog nadat het eerste bericht is verzonden.
Wanneer de BEGIN DIALOG CONVERSATION verklaring geen gerelateerd gesprek of gespreksgroep specificeert, maakt Service Broker een nieuwe gespreksgroep aan voor het nieuwe gesprek.
Service Broker staat geen willekeurige groeperingen van gesprekken toe. Alle gesprekken in een gespreksgroep moeten de dienst die in de FROM-clausule is gespecificeerd hebben als initiator of doelwit van het gesprek.
Het BEGIN DIALOG CONVERSATION commando vergrendelt de gespreksgroep die de dialog_handle bevat die terugkomt. Wanneer het commando een RELATED_CONVERSATION_GROUP clausule bevat, is de gespreksgroep voor dialog_handle de gespreksgroep die is gespecificeerd in de related_conversation_group_id-parameter . Wanneer het commando een RELATED_CONVERSATION clausule bevat, is de gespreksgroep voor dialog_handle de gespreksgroep die aan de related_conversation_handle gespecificeerde is gekoppeld.
BEGIN DIALOG CONVERSATION is niet geldig in een door de gebruiker gedefinieerde functie.
Permissions
Om een dialoog te starten, moet de huidige gebruiker toestemming hebben RECEIVE voor de wachtrij voor de dienst die is gespecificeerd in de FROM-clausule van het commando en REFERENCES-toestemming voor het gespecificeerde contract.
Examples
A. Een dialoog beginnen
Het volgende voorbeeld begint een dialooggesprek en slaat een identificatie op voor de dialoog in @dialog_handle. De //Adventure-Works.com/ExpenseClient service is de initiator van de dialoog, en de //Adventure-Works.com/Expenses service is het doelwit van de dialoog. De dialoog volgt het contract //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. Een dialoog beginnen met een expliciet leven
Het volgende voorbeeld start een dialooggesprek en slaat een identificatiecode op voor de dialoog in @dialog_handle. De //Adventure-Works.com/ExpenseClient service is de initiator van de dialoog, en de //Adventure-Works.com/Expenses service is het doelwit van de dialoog. De dialoog volgt het contract //Adventure-Works.com/Expenses/ExpenseSubmission. Als de dialoog niet binnen 60 enkele seconden door het END CONVERSATION commando is gesloten, beëindigt de broker de dialoog met een foutmelding.
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. Een dialoog beginnen met een specifieke broker-instantie
Het volgende voorbeeld start een dialooggesprek en slaat een identificatiecode op voor de dialoog in @dialog_handle. De //Adventure-Works.com/ExpenseClient service is de initiator van de dialoog, en de //Adventure-Works.com/Expenses service is het doelwit van de dialoog. De dialoog volgt het contract //Adventure-Works.com/Expenses/ExpenseSubmission. De broker stuurt berichten in deze dialoog naar de broker die door de GUID is geïdentificeerd 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. Een dialoog beginnen en deze relateren aan een bestaande gespreksgroep
Het volgende voorbeeld start een dialooggesprek en slaat een identificatiecode op voor de dialoog in @dialog_handle. De //Adventure-Works.com/ExpenseClient service is de initiator van de dialoog, en de //Adventure-Works.com/Expenses service is het doelwit van de dialoog. De dialoog volgt het contract //Adventure-Works.com/Expenses/ExpenseSubmission. De makelaar koppelt de dialoog aan de gespreksgroep die wordt geïdentificeerd in @conversation_group_id plaats van een nieuwe gespreksgroep aan te maken.
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. Een dialoog beginnen met een expliciet leven, en de dialoog relateren aan een bestaand gesprek
Het volgende voorbeeld start een dialooggesprek en slaat een identificatiecode op voor de dialoog in @dialog_handle. De //Adventure-Works.com/ExpenseClient service is de initiator van de dialoog, en de //Adventure-Works.com/Expenses service is het doelwit van de dialoog. De dialoog volgt het contract //Adventure-Works.com/Expenses/ExpenseSubmission. De nieuwe dialoog behoort tot dezelfde gespreksgroep als @existing_conversation_handle waartoe behoort. Als de dialoog niet binnen 600 enkele seconden door het END CONVERSATION commando is gesloten, beëindigt Service Broker het dialoog met een foutmelding.
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. Een dialoog beginnen met optionele encryptie
Het volgende voorbeeld begint een dialoog en slaat een identificatie op voor de dialoog in @dialog_handle. De //Adventure-Works.com/ExpenseClient service is de initiator van de dialoog, en de //Adventure-Works.com/Expenses service is het doelwit van de dialoog. De dialoog volgt het contract //Adventure-Works.com/Expenses/ExpenseSubmission. Het gesprek in dit voorbeeld maakt het mogelijk dat het bericht zonder encryptie over het netwerk kan reizen als er geen encryptie beschikbaar is.
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 ;
Zie ook
BEGIN CONVERSATION TIMER (Transact-SQL)
END CONVERSATION (Transact-SQL)
MOVE CONVERSATION (Transact-SQL)
sys.gespreks_eindpunten (Transact-SQL)