BEGIN DIALOG CONVERSATION (Transact-SQL)

Aplica-se a: SQL ServerAzure SQL Managed Instance

Inicia um diálogo de um serviço para outro. Um diálogo é uma conversa que fornece mensagens exatamente uma vez por ordem entre dois serviços.

Transact-SQL convenções de sintaxe

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
É uma variável usada para armazenar o handle de diálogo gerado pelo sistema para o novo diálogo que é devolvido pela BEGIN DIALOG CONVERSATION instrução. A variável deve ser do tipo uniqueidentifier.

DE SERVICEinitiator_service_name
Especifica o serviço que inicia o diálogo. O nome especificado deve ser o nome de um serviço na base de dados atual. A fila especificada para o serviço iniciador recebe mensagens devolvidas pelo serviço alvo e mensagens criadas pelo Service Broker para esta conversa.

PARA SERVICE'target_service_name'
Especifica o serviço alvo com o qual iniciar o diálogo. O target_service_name é do tipo nvarchar(256). O Service Broker utiliza uma comparação byte a byte para corresponder à cadeia de target_service_name . Por outras palavras, a comparação é sensível a maiúsculas e minúsculas e não tem em conta a colação atual.

service_broker_guid
Especifica a base de dados que aloja o serviço alvo. Quando mais do que uma base de dados aloja uma instância do serviço alvo, pode comunicar com uma base de dados específica fornecendo uma service_broker_guid.

O service_broker_guid é do tipo nvarchar(128). Para encontrar a service_broker_guid de uma base de dados, execute a seguinte consulta na base de dados:

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

Note

Esta opção não está disponível em um banco de dados contido.

'ATUAL DATABASE'
Especifica que a conversa deve usar o service_broker_guid para a base de dados atual.

EM CONTRACTcontract_name
Especifica o contrato que esta conversa segue. O contrato deve existir na base de dados atual. Se o serviço-alvo não aceitar novas conversas no contrato especificado, o Service Broker devolve uma mensagem de erro na conversa. Quando esta cláusula é omitida, a conversa segue o contrato denominado DEFAULT.

RELATED_CONVERSATION =related_conversation_handle
Especifica o grupo de conversa existente ao qual o novo diálogo é adicionado. Quando esta cláusula está presente, o novo diálogo pertence ao mesmo grupo de conversa que o diálogo especificado por related_conversation_handle. O related_conversation_handledeve ser de um tipo implicitamente convertível para typeidentifier. A declaração falha se o related_conversation_handle não fizer referência a um diálogo existente.

RELATED_CONVERSATION_GROUP =related_conversation_group_id
Especifica o grupo de conversa existente ao qual o novo diálogo é adicionado. Quando esta cláusula estiver presente, o novo diálogo será adicionado ao grupo de conversa especificado por related_conversation_group_id. O related_conversation_group_iddeve ser de um tipo implicitamente convertível para typeidentifier. Se related_conversation_group_idnão referenciar um grupo de conversa existente, o broker de serviços cria um novo grupo de conversa com o related_conversation_group_id especificado e relaciona o novo diálogo com esse grupo de conversa.

VIDA =dialog_lifetime
Especifica o tempo máximo que o diálogo permanecerá aberto. Para que o diálogo seja concluído com sucesso, ambos os pontos finais têm de terminar explicitamente o diálogo antes que o tempo de vida expire. O valor dialog_lifetime deve ser expresso em segundos. A vida é do tipo int. Quando não é especificada nenhuma cláusula LIFETIME, o tempo de vida do diálogo é o valor máximo do tipo de dado int .

ENCRIPTAÇÃO
Especifica se as mensagens enviadas e recebidas neste diálogo devem ou não ser encriptadas quando são enviadas fora de uma instância do Microsoft SQL Server. Um diálogo que tem de ser encriptado é um diálogo seguro. Quando ENCRYPTION = ON e os certificados necessários para suportar encriptação não estão configurados, o Service Broker devolve uma mensagem de erro na conversa. Se ENCRYPTION = OFF, a encriptação é usada se uma ligação remota de serviço for configurada para o target_service_name; caso contrário, as mensagens são enviadas sem encriptação. Se esta cláusula não estiver presente, o valor padrão é ON.

Note

Mensagens trocadas com serviços na mesma instância do SQL Server nunca são encriptadas. No entanto, uma chave mestra de base de dados e os certificados de encriptação continuam a ser necessários para conversas que utilizam encriptação se os serviços para a conversa estiverem em bases de dados diferentes. Isto permite que as conversas continuem caso de uma das bases de dados ser movida para uma instância diferente enquanto a conversa está em curso.

Remarks

Todas as mensagens fazem parte de uma conversa. Portanto, um serviço iniciador deve iniciar uma conversa com o serviço alvo antes de enviar uma mensagem ao serviço alvo. A informação especificada na BEGIN DIALOG CONVERSATION declaração é semelhante à morada de uma carta; O Service Broker utiliza a informação para entregar mensagens ao serviço correto. O serviço especificado na cláusula TO SERVICE é o endereço para onde as mensagens são enviadas. O serviço especificado na cláusula FROM SERVICE é o endereço de retorno usado para mensagens de resposta.

O alvo de uma conversa não precisa de ligar.BEGIN DIALOG CONVERSATION O Service Broker cria uma conversa na base de dados alvo quando a primeira mensagem da conversa chega do iniciador.

Iniciar um diálogo cria um ponto final de conversa na base de dados para o serviço iniciador, mas não cria uma ligação de rede à instância que hospeda o serviço alvo. O Service Broker não estabelece comunicação com o alvo do diálogo até que a primeira mensagem seja enviada.

Quando a BEGIN DIALOG CONVERSATION declaração não especifica uma conversa relacionada ou um grupo de conversa relacionado, o Service Broker cria um novo grupo de conversa para essa nova conversa.

O Service Broker não permite agrupamentos arbitrários de conversas. Todas as conversas num grupo de conversa devem ter o serviço especificado na cláusula FROM como iniciador ou alvo da conversa.

O BEGIN DIALOG CONVERSATION comando bloqueia o grupo de conversa que contém o dialog_handle devolvido. Quando o comando inclui uma cláusula RELATED_CONVERSATION_GROUP, o grupo de conversa para dialog_handle é o grupo de conversa especificado no parâmetro related_conversation_group_id . Quando o comando inclui uma cláusula de RELATED_CONVERSATION, o grupo de conversa para dialog_handle é o grupo associado à related_conversation_handle especificada.

BEGIN DIALOG CONVERSATION não é válido numa função definida pelo utilizador.

Permissions

Para iniciar um diálogo, o utilizador atual deve ter RECEIVE permissão na fila para o serviço especificado na cláusula FROM do comando e permissão REFERENCES para o contrato especificado.

Examples

A. Início de um diálogo

O exemplo seguinte inicia uma conversa de diálogo e armazena um identificador para o diálogo em @dialog_handle. O //Adventure-Works.com/ExpenseClient serviço é o iniciador do diálogo, e o //Adventure-Works.com/Expenses serviço é o alvo do diálogo. O diálogo segue o contrato //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. Iniciar um diálogo com uma vida explícita

O exemplo seguinte inicia uma conversa de diálogo e armazena um identificador para o diálogo em @dialog_handle. O //Adventure-Works.com/ExpenseClient serviço é o iniciador do diálogo, e o //Adventure-Works.com/Expenses serviço é o alvo do diálogo. O diálogo segue o contrato //Adventure-Works.com/Expenses/ExpenseSubmission. Se o diálogo não for encerrado pelo END CONVERSATION comando em segundos 60 , o corretor termina o diálogo com um erro.

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. Iniciar um diálogo com uma instância de corretor específica

O exemplo seguinte inicia uma conversa de diálogo e armazena um identificador para o diálogo em @dialog_handle. O //Adventure-Works.com/ExpenseClient serviço é o iniciador do diálogo, e o //Adventure-Works.com/Expenses serviço é o alvo do diálogo. O diálogo segue o contrato //Adventure-Works.com/Expenses/ExpenseSubmission. O corretor encaminha mensagens neste diálogo para o corretor identificado pelo 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. Iniciar um diálogo e relacioná-lo com um grupo de conversa já existente

O exemplo seguinte inicia uma conversa de diálogo e armazena um identificador para o diálogo em @dialog_handle. O //Adventure-Works.com/ExpenseClient serviço é o iniciador do diálogo, e o //Adventure-Works.com/Expenses serviço é o alvo do diálogo. O diálogo segue o contrato //Adventure-Works.com/Expenses/ExpenseSubmission. O corretor associa a conversa ao grupo de conversa identificado em @conversation_group_id vez de criar um novo grupo de conversa.

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. Começar um diálogo com uma vida explícita e relacionar o diálogo com uma conversa já existente

O exemplo seguinte inicia uma conversa de diálogo e armazena um identificador para o diálogo em @dialog_handle. O //Adventure-Works.com/ExpenseClient serviço é o iniciador do diálogo, e o //Adventure-Works.com/Expenses serviço é o alvo do diálogo. O diálogo segue o contrato //Adventure-Works.com/Expenses/ExpenseSubmission. O novo diálogo pertence ao mesmo grupo de conversa a que @existing_conversation_handle pertence. Se o diálogo não for encerrado pelo END CONVERSATION comando em segundos 600 , o Service Broker termina o diálogo com um erro.

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. Iniciar um diálogo com encriptação opcional

O exemplo seguinte inicia um diálogo e armazena um identificador para o diálogo em @dialog_handle. O //Adventure-Works.com/ExpenseClient serviço é o iniciador do diálogo, e o //Adventure-Works.com/Expenses serviço é o alvo do diálogo. O diálogo segue o contrato //Adventure-Works.com/Expenses/ExpenseSubmission. A conversa neste exemplo permite que a mensagem viaje pela rede sem encriptação se a encriptação não estiver disponível.

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 ;  

Ver também

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