Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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 relative alla 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
È una variabile utilizzata per memorizzare l'handle di dialogo generato dal sistema per il nuovo dialogo restituito dall'istruzione BEGIN DIALOG CONVERSATION . La variabile deve essere di tipo uniqueidentifier.
DA SERVICEinitiator_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.
PER 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.
'ATTUALE DATABASE'
Specifica che la conversazione usa il service_broker_guid per il database corrente.
IL CONTRACTcontract_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. Quando questa clausola viene omessita, la conversazione segue 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.
VITA =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 nella BEGIN DIALOG CONVERSATION dichiarazione sono simili all'indirizzo di una lettera; Service Broker utilizza le informazioni per consegnare 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 di ritorno utilizzato per i messaggi di risposta.
Il bersaglio di una conversazione non deve necessariamente chiamare 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.
Quando la BEGIN DIALOG CONVERSATION dichiarazione non specifica una conversazione correlata o un gruppo di conversazione correlato, Service Broker crea un nuovo gruppo di conversazione 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 BEGIN DIALOG CONVERSATION comando blocca il gruppo di conversazione 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 all'argomento related_conversation_handle specificato.
BEGIN DIALOG CONVERSATION non è valido in una funzione definita dall'utente.
Autorizzazioni
Per avviare un dialogo, l'utente attuale deve avere RECEIVE il permesso in coda per il servizio specificato nella clausola FROM del comando e il permesso 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 è stato chiuso dal END CONVERSATION comando entro 60 pochi secondi, il 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 è stato chiuso dal END CONVERSATION comando entro 600 pochi 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)