BEGIN DIALOG CONVERSATION (Transact-SQL)

Platí na:SQL ServerAzureSQL Managed Instance

Začíná dialog z jedné služby do druhé. Dialog je konverzace, která poskytuje zprávy přesně jednou v pořadí mezi dvěma službami.

Transact-SQL konvence syntaxe

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
je proměnná používaná k uložení systémově generovaného dialogového handle pro nový dialog, který je vrácen příkazem BEGIN DIALOG CONVERSATION . Proměnná musí být typu uniqueidentifier.

OD SERVICEinitiator_service_name
Specifikuje službu, která dialog zahajuje. Specifikovaný název musí být názvem služby v aktuální databázi. Fronta určená pro iniciátorskou službu přijímá zprávy vrácené cílovou službou a zprávy vytvořené Service Brokerem pro tuto konverzaci.

NA SERVICE'target_service_name'
Specifikuje cílovou službu, se kterou má dialog zahájit. target_service_name je typu nvarchar(256). Service Broker používá porovnání bajt po bajtu k porovnání target_service_name řetězce. Jinými slovy, srovnání je citlivé na velikost a velikost a nebere v úvahu aktuální porovnání.

service_broker_guid
Specifikuje databázi, která hostuje cílovou službu. Když více databází hostuje instanci cílové služby, můžete komunikovat s konkrétní databází poskytnutím service_broker_guid.

service_broker_guid je typu nvarchar(128). Chcete-li najít service_broker_guid databáze, spusťte v databázi následující dotaz:

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

Note

Tato možnost není dostupná v uzavřené databázi.

'SOUČASNÝ DATABASE'
Specifikuje, že konverzace používá service_broker_guid pro aktuální databázi.

Na CONTRACT
Specifikuje smlouvu, podle které tento rozhovor následuje. Smlouva musí existovat v aktuální databázi. Pokud cílová služba nepřijímá nové konverzace podle specifikované smlouvy, Service Broker vrátí chybovou zprávu o konverzaci. Když je tato klauzule vynechána, konverzace následuje po smlouvě nazvané DEFAULT.

RELATED_CONVERSATION =related_conversation_handle
Specifikuje stávající konverzační skupinu, do které je nový dialog přidán. Když je tato klauzule přítomna, nový dialog patří do stejné konverzační skupiny jako dialog specifikovaný related_conversation_handle. related_conversation_handlemusí být typu implicitně převeditelného na typ uniqueidentifier. Tvrzení selže, pokud related_conversation_handle neodkazuje na existující dialog.

RELATED_CONVERSATION_GROUP =related_conversation_group_id
Specifikuje stávající konverzační skupinu, do které je nový dialog přidán. Když je tato klauzule přítomna, nový dialog bude přidán do konverzační skupiny určené related_conversation_group_id. related_conversation_group_idmusí být typu implicitně převést na typ uniqueidentifier. Pokud related_conversation_group_idneodkazuje na existující konverzační skupinu, servisní makléř vytvoří novou konverzační skupinu s určeným related_conversation_group_id a nový dialog s touto skupinou propojí.

= dialog_lifetime
Určuje maximální dobu, po kterou zůstane dialog otevřený. Aby byl dialog úspěšně dokončen, musí oba koncové body explicitně ukončit dialog před uplynutím doby života. Hodnota dialog_lifetime musí být vyjádřena v sekundách. Lifetime je typu int. Pokud není specifikována klauzule LIFETIME, životnost dialogu je maximální hodnota datového typu int .

ENCRYPTION
Specifikuje, zda zprávy odeslané a přijaté v tomto dialogu musí být zašifrované, pokud jsou odesílány mimo instanci Microsoft SQL Server. Dialog, který musí být zašifrovaný, je zabezpečený dialog. Když ENCRYPTION = ON a certifikáty potřebné k podpoře šifrování nejsou nakonfigurovány, Service Broker vrátí chybovou zprávu o konverzaci. Pokud je ENCRYPTION = VYPNUTO, šifrování se použije, pokud je pro target_service_name nakonfigurováno vzdálené služební vázání; jinak jsou zprávy odesílány nešifrovaně. Pokud tato klauzule není přítomna, výchozí hodnota je ZAPNUTO.

Note

Zprávy vyměňované se službami ve stejné instanci SQL Server nejsou nikdy šifrovány. Nicméně pro konverzace využívající šifrování je stále vyžadován hlavní klíč databáze a certifikáty pro šifrování, pokud jsou služby pro konverzaci v různých databázích. To umožňuje pokračovat v konverzaci v případě, že je jedna z databází přesunuta na jinou instanci během probíhající konverzace.

Remarks

Všechny zprávy jsou součástí konverzace. Proto musí zahajující služba zahájit konverzaci s cílovou službou před odesláním zprávy cílové službě. Informace uvedené ve výpovědi BEGIN DIALOG CONVERSATION jsou podobné adrese na dopise; Service Broker využívá tyto informace k doručení zpráv správné službě. Služba specifikovaná v klauzuli TO SERVICE je adresa, na kterou jsou zprávy odesílány. Služba specifikovaná v klauzuli FROM SERVICE je zpáteční adresa používaná pro odpovědi.

Cíl konverzace nemusí volat BEGIN DIALOG CONVERSATION. Service Broker vytváří konverzaci v cílové databázi, když dorazí první zpráva z konverzace od iniciátora.

Zahájení dialogu vytváří konverzační endpoint v databázi pro iniciující službu, ale nevytvoří síťové spojení s instancí, která hostuje cílovou službu. Service Broker nenaváže komunikaci s cílovou osobou dialogu, dokud není odeslána první zpráva.

Pokud BEGIN DIALOG CONVERSATION prohlášení nespecifikuje související konverzaci nebo skupinu pro konverzaci, Service Broker vytvoří novou konverzační skupinu pro novou konverzaci.

Service Broker neumožňuje libovolné seskupování konverzací. Všechny konverzace ve skupině musí mít službu uvedenou v klauzuli FROM jako iniciátora nebo cílového účastníka konverzace.

Příkaz BEGIN DIALOG CONVERSATION uzamkne konverzační skupinu, která obsahuje dialog_handle vrácené. Když příkaz obsahuje klauzuli RELATED_CONVERSATION_GROUP, konverzační skupina pro dialog_handle je konverzační skupina specifikovaná v parametru related_conversation_group_id . Když příkaz obsahuje RELATED_CONVERSATION klauzuli, konverzační skupina pro dialog_handle je konverzační skupina spojená s určeným related_conversation_handle .

BEGIN DIALOG CONVERSATION není platná v uživatelsky definované funkci.

Permissions

Pro zahájení dialogu musí mít aktuální uživatel RECEIVE oprávnění ve frontě pro službu uvedenou v klauzuli FROM příkazu a oprávnění REFERENCES pro zadanou smlouvu.

Examples

A. Začátek dialogu

Následující příklad zahajuje dialogovou konverzaci a ukládá identifikátor dialogu v Služba @dialog_handle.//Adventure-Works.com/ExpenseClient je iniciátorem dialogu a služba //Adventure-Works.com/Expenses je cílem dialogu. Dialog následuje po smlouvě //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. Začátek dialogu s explicitním životem

Následující příklad zahajuje dialogovou konverzaci a ukládá identifikátor pro dialog v .@dialog_handle Služba //Adventure-Works.com/ExpenseClient je iniciátorem dialogu a služba //Adventure-Works.com/Expenses je cílem dialogu. Dialog následuje po smlouvě //Adventure-Works.com/Expenses/ExpenseSubmission. Pokud dialog nebyl příkazem END CONVERSATION uzavřen během 60 několika sekund, broker dialog ukončí chybou.

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. Zahájení dialogu s konkrétní instancí brokera

Následující příklad zahajuje dialogovou konverzaci a ukládá identifikátor pro dialog v .@dialog_handle Služba //Adventure-Works.com/ExpenseClient je iniciátorem dialogu a služba //Adventure-Works.com/Expenses je cílem dialogu. Dialog následuje po smlouvě //Adventure-Works.com/Expenses/ExpenseSubmission. Broker přesměruje zprávy v tomto dialogu na brokera identifikovaného 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. Zahájení dialogu a jeho propojení s existující konverzační skupinou

Následující příklad zahajuje dialogovou konverzaci a ukládá identifikátor pro dialog v .@dialog_handle Služba //Adventure-Works.com/ExpenseClient je iniciátorem dialogu a služba //Adventure-Works.com/Expenses je cílem dialogu. Dialog následuje po smlouvě //Adventure-Works.com/Expenses/ExpenseSubmission. Broker spojuje dialog s identifikovanou konverzační skupinou @conversation_group_id místo vytváření nové konverzační skupiny.

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. Začít dialog s explicitním životem a propojit dialog s existujícím rozhovorem

Následující příklad zahajuje dialogovou konverzaci a ukládá identifikátor pro dialog v .@dialog_handle Služba //Adventure-Works.com/ExpenseClient je iniciátorem dialogu a služba //Adventure-Works.com/Expenses je cílem dialogu. Dialog následuje po smlouvě //Adventure-Works.com/Expenses/ExpenseSubmission. Nový dialog patří do stejné konverzační skupiny jako ta @existing_conversation_handle . Pokud dialog nebyl příkazem END CONVERSATION uzavřen během 600 několika sekund, Service Broker dialog ukončí chybou.

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. Zahájení dialogu s volitelným šifrováním

Následující příklad začíná dialog a ukládá identifikátor dialogu do .@dialog_handle Služba //Adventure-Works.com/ExpenseClient je iniciátorem dialogu a služba //Adventure-Works.com/Expenses je cílem dialogu. Dialog následuje po smlouvě //Adventure-Works.com/Expenses/ExpenseSubmission. Konverzace v tomto příkladu umožňuje zprávě cestovat sítí bez šifrování, pokud není šifrování dostupné.

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 ;