Condividi tramite


BEGIN DIALOG CONVERSATION (Transact-SQL)

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.

Icona di collegamento a un argomento Convenzioni della 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 }  ] ]
[ ; ]

Argomenti

  • @ dialog_handle
    Variabile utilizzata per archiviare l'handle di dialogo generato dal sistema per il nuovo dialogo restituito dall'istruzione BEGIN DIALOG CONVERSATION. Tale 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 la corrispondenza della stringa target_service_name, Service Broker utilizza 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 utilizza il service_broker_guids 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 alla stesso gruppo di conversazioni del dialogo specificato da related_conversation_handle. Il parametro related_conversation_handledeve 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. Il parametro related_conversation_group_iddeve essere di un tipo convertibile in modo implicito nel tipo uniqueidentifier. Se related_conversation_group_idnon fa riferimento a un gruppo di conversazioni esistente, Service Broker crea un nuovo gruppo di conversazioni con il valore related_conversation_group_id specificato e associa il nuovo dialogo a tale 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 ed è di tipo int. Se non si specifica la clausola LIFETIME, la durata del dialogo corrisponde al 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 utilizzata se è configurata un'associazione al servizio remoto per target_service_name. In caso contrario, i messaggi vengono inviati in forma non crittografata. 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 utilizzate 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 il 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 al parametro 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

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 ;

Vedere anche

Riferimento

BEGIN CONVERSATION TIMER (Transact-SQL)

END CONVERSATION (Transact-SQL)

MOVE CONVERSATION (Transact-SQL)

sys.conversation_endpoints (Transact-SQL)