BEGIN DIALOG CONVERSATION (Transact-SQL)

Si applica a:SQL Server Istanza gestita di SQL di Azure

Inizia un dialogo da un servizio a un altro servizio. Un dialogo è una conversazione per lo scambio di messaggi tra due servizi, messaggi che vengono inviati una sola volta e rispettando l'ordine di invio.

Convenzioni di sintassi Transact-SQL

Sintassi

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

Nota

Per visualizzare la sintassi Transact-SQL per SQL Server 2014 (12.x) e versioni precedenti, vedere la documentazione delle versioni precedenti.

Argomenti

@dialog_handle
Variabile utilizzata per archiviare l'handle di dialogo generato dal sistema per il nuovo dialogo restituito dall'istruzione BEGIN DIALOG CONVERSATION. La variabile deve essere di tipo uniqueidentifier.

FROM SERVICE initiator_service_name
Specifica il servizio che inizia il dialogo. Il nome specificato deve essere il nome di un servizio nel database corrente. La coda specificata per il servizio initiator riceve i messaggi restituiti dal servizio di destinazione e i messaggi creati da Service Broker per la conversazione.

TO SERVICE 'target_service_name'
Specifica il servizio di destinazione con cui iniziare il dialogo. target_service_name è di tipo nvarchar(256). Per trovare la corrispondenza con la stringa target_service_name, Service Broker usa un confronto byte per byte. In altre parole, viene eseguito un confronto con distinzione tra maiuscole e minuscole senza tenere conto delle regole di confronto correnti.

service_broker_guid
Specifica il database che ospita il servizio di destinazione. Se un'istanza del servizio di destinazione è ospitata in più di un database, è possibile comunicare con un database specifico indicando un service_broker_guid.

service_broker_guid è di tipo nvarchar(128). Per individuare il service_broker_guid di un database, eseguire la query seguente nel database:

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

Nota

Questa opzione non è disponibile in un database indipendente.

'CURRENT DATABASE'
Specifica che la conversazione usa il service_broker_guid per il database corrente.

ON CONTRACT contract_name
Specifica il contratto rispettato dalla conversazione. Il contratto deve esistere nel database corrente. Se il servizio di destinazione non accetta nuove conversazioni in base al contratto specificato, Service Broker restituisce un messaggio di errore nella conversazione. Se la clausola viene omessa, la conversazione rispetta il contratto denominato DEFAULT.

RELATED_CONVERSATION =related_conversation_handle
Specifica il gruppo di conversazioni esistente a cui viene aggiunto il nuovo dialogo. Se si specifica questa clausola, il nuovo dialogo appartiene allo stesso gruppo di conversazioni del dialogo specificato da related_conversation_handle. L'argomento related_conversation_handle deve essere di un tipo convertibile in modo implicito nel tipo uniqueidentifier. L'istruzione ha esito negativo se related_conversation_handle non fa riferimento a un dialogo esistente.

RELATED_CONVERSATION_GROUP =related_conversation_group_id
Specifica il gruppo di conversazioni esistente a cui viene aggiunto il nuovo dialogo. Se si specifica questa clausola, il nuovo dialogo verrà aggiunto al gruppo di conversazioni specificato da related_conversation_group_id. L'argomento related_conversation_group_id deve essere di un tipo convertibile in modo implicito nel tipo uniqueidentifier. Se related_conversation_group_id non fa riferimento a un gruppo di conversazioni esistente, Service Broker crea un nuovo gruppo di conversazioni con l'argomento related_conversation_group_id specificato e associa il nuovo dialogo a questo gruppo di conversazioni.

LIFETIME =dialog_lifetime
Specifica la quantità massima di tempo per cui il dialogo rimarrà aperto. Per il corretto completamento del dialogo, è necessario che entrambi gli endpoint terminino il dialogo in modo esplicito prima della scadenza della durata. Il valore di dialog_lifetime deve essere espresso in secondi. La durata è di tipo int. Quando non viene specificata alcuna clausola LIFETIME, la durata della finestra di dialogo è il valore massimo del tipo di dati int .

ENCRYPTION
Specifica se i messaggi inviati e ricevuti nel dialogo devono essere crittografati quando vengono inviati all'esterno di un'istanza di Microsoft SQL Server. Un dialogo che deve essere crittografato viene definito dialogo protetto. Se ENCRYPTION = ON e non sono configurati i certificati necessari per il supporto della crittografia, Service Broker restituisce un messaggio di errore nella conversazione. Se ENCRYPTION = OFF, la crittografia viene usata se è configurata un'associazione al servizio remoto per target_service_name. In caso contrario, i messaggi verranno inviati in formato non crittografato. Se la clausola viene omessa, il valore predefinito è ON.

Nota

I messaggi scambiati tra servizi nella stessa istanza di SQL Server non vengono mai crittografati. Tuttavia, sono comunque necessari una chiave master del database e i certificati per la crittografia per le conversazioni che utilizzano la crittografia, se i servizi per la conversazione si trovano in database diversi. In questo modo le conversazioni non vengono interrotte nel caso uno dei database venga spostato in un'istanza diversa mentre è in corso una conversazione.

Osservazioni:

Tutti i messaggi fanno parte di una conversazione. Pertanto, un servizio initiator deve iniziare una conversazione con il servizio di destinazione prima di inviare un messaggio a quest'ultimo. Le informazioni specificate nell'istruzione BEGIN DIALOG CONVERSATION, paragonabili all'indirizzo di una lettera, vengono usate da Service Broker per recapitare i messaggi al servizio corretto. Il servizio specificato nella clausola TO SERVICE è l'indirizzo a cui vengono inviati i messaggi. Il servizio specificato nella clausola FROM SERVICE è l'indirizzo del mittente utilizzato per i messaggi di risposta.

Non è necessario che la destinazione di una conversazione chiami BEGIN DIALOG CONVERSATION. Service Broker crea una conversazione nel database di destinazione quando arriva dall'initiator il primo messaggio della conversazione.

Con l'inizio di un dialogo viene creato un endpoint di conversazione nel database per il servizio di origine, ma non viene creata una connessione di rete all'istanza che ospita il servizio di destinazione. La comunicazione con la destinazione del dialogo viene stabilita da Service Broker solo dopo l'invio del primo messaggio.

Se nell'istruzione BEGIN DIALOG CONVERSATION non viene specificata una conversazione o un gruppo di conversazioni correlato, Service Broker crea un nuovo gruppo di conversazioni per la nuova conversazione.

Service Broker non consente raggruppamenti arbitrari delle conversazioni. Per tutte le conversazioni in un gruppo è necessario specificare il servizio nella clausola FROM, come initiator o destinazione della conversazione.

Il comando BEGIN DIALOG CONVERSATION blocca il gruppo di conversazioni che contiene l'argomento dialog_handle restituito. Se il comando include una clausola RELATED_CONVERSATION_GROUP, il gruppo di conversazioni per dialog_handle è il gruppo di conversazioni specificato nel parametro related_conversation_group_id. Se il comando include una clausola RELATED_CONVERSATION, il gruppo di conversazioni per dialog_handle è il gruppo di conversazioni associato all'argomento related_conversation_handle specificato.

BEGIN DIALOG CONVERSATION non è un'istruzione valida in una funzione definita dall'utente.

Autorizzazioni

Per iniziare un dialogo, l'utente corrente deve disporre dell'autorizzazione RECEIVE per la coda del servizio specificato nella clausola FROM del comando e dell'autorizzazione REFERENCES per il contratto specificato.

Esempi

R. Inizio di un dialogo

Nell'esempio seguente viene avviata una conversazione di dialogo e viene archiviato un identificatore per il dialogo in @dialog_handle.. Il servizio //Adventure-Works.com/ExpenseClient è l'initiator del dialogo, mentre il servizio //Adventure-Works.com/Expenses è la destinazione del dialogo. Il dialogo è basato sul contratto //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. Inizio di un dialogo con una durata esplicita

Nell'esempio seguente viene avviata una conversazione di dialogo e viene archiviato un identificatore per il dialogo in @dialog_handle. //Adventure-Works.com/ExpenseClient è il servizio initiator del dialogo, mentre //Adventure-Works.com/Expenses rappresenta il servizio di destinazione del dialogo. Il dialogo è basato sul contratto //Adventure-Works.com/Expenses/ExpenseSubmission. Se il dialogo non viene chiuso dal comando END CONVERSATION entro 60 secondi, Service Broker termina il dialogo con un errore.

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. Inizio di un dialogo con un'istanza specifica di Service Broker

Nell'esempio seguente viene avviata una conversazione di dialogo e viene archiviato un identificatore per il dialogo in @dialog_handle. //Adventure-Works.com/ExpenseClient è il servizio initiator del dialogo, mentre //Adventure-Works.com/Expenses rappresenta il servizio di destinazione del dialogo. Il dialogo è basato sul contratto //Adventure-Works.com/Expenses/ExpenseSubmission. Service Broker indirizza i messaggi di questo dialogo all'istanza di Service Broker identificata dal 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. Inizio di un dialogo e associazione del dialogo a un gruppo di conversazioni esistente

Nell'esempio seguente viene avviata una conversazione di dialogo e viene archiviato un identificatore per il dialogo in @dialog_handle. //Adventure-Works.com/ExpenseClient è il servizio initiator del dialogo, mentre //Adventure-Works.com/Expenses rappresenta il servizio di destinazione del dialogo. Il dialogo è basato sul contratto //Adventure-Works.com/Expenses/ExpenseSubmission. Service Broker associa il dialogo al gruppo di conversazioni identificato da @conversation_group_id, anziché creare un nuovo gruppo di conversazioni.

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. Inizio di un dialogo con una durata esplicita e associazione del dialogo a una conversazione esistente

Nell'esempio seguente viene avviata una conversazione di dialogo e viene archiviato un identificatore per il dialogo in @dialog_handle. //Adventure-Works.com/ExpenseClient è il servizio initiator del dialogo, mentre //Adventure-Works.com/Expenses rappresenta il servizio di destinazione del dialogo. Il dialogo è basato sul contratto //Adventure-Works.com/Expenses/ExpenseSubmission. Il nuovo dialogo appartiene allo stesso gruppo di conversazioni a cui appartiene @existing_conversation_handle. Se il dialogo non viene chiuso dal comando END CONVERSATION entro 600 secondi, Service Broker termina il dialogo con un errore.

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. Inizio di un dialogo con crittografia facoltativa

Nell'esempio seguente viene avviato un dialogo e viene archiviato un identificatore per il dialogo in @dialog_handle. //Adventure-Works.com/ExpenseClient è il servizio initiator del dialogo, mentre //Adventure-Works.com/Expenses rappresenta il servizio di destinazione del dialogo. Il dialogo è basato sul contratto //Adventure-Works.com/Expenses/ExpenseSubmission. La conversazione in questo esempio consente la trasmissione in rete del messaggio senza crittografia, se la crittografia non è disponibile.

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 ;  

Vedi anche

BEGIN CONVERSATION TIMER (Transact-SQL)
END CONVERSATION (Transact-SQL)
MOVE CONVERSATION (Transact-SQL)
sys.conversation_endpoints (Transact-SQL)