Compartilhar via


BEGIN DIALOG CONVERSATION (Transact-SQL)

Inicia uma caixa de diálogo de um serviço para outro. Uma caixa de diálogo é uma conversação que fornece mensagens exatamente na mesma ordem entre dois serviços.

Ícone de vínculo de tópicoConvenções de sintaxe Transact-SQL

Sintaxe

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

Argumentos

  • **@**dialog_handle
    É uma variável usada para armazenar o identificador da caixa de diálogo gerada pelo sistema para a nova caixa de diálogo que é retornada pela instrução BEGIN DIALOG CONVERSATION. A variável deve ser do tipo uniqueidentifier.

  • FROM SERVICE initiator_service_name
    Especifica o serviço que inicia a caixa de diálogo. O nome especificado deve ser o nome de um serviço no banco de dados atual. A fila especificada para o serviço iniciador recebe mensagens retornadas pelo serviço de destino e mensagens criadas pelo Agente de Serviços para essa conversação.

  • TO SERVICE 'target_service_name'
    Especifica o serviço de destino com o qual iniciar a caixa de diálogo. O target_service_name é do tipo nvarchar(256). O Service Broker usa uma comparação byte por byte para fazer a correspondência da cadeia de caracteres target_service_name. Em outras palavras, a comparação diferencia maiúsculas de minúsculas e não leva em conta o agrupamento atual.

  • service_broker_guid
    Especifica o banco de dados que hospeda o serviço de destino. Quando mais de um banco de dados hospeda uma instância do serviço de destino, é possível se comunicar com um banco de dados específico fornecendo um service_broker_guid.

    O service_broker_guid é do tipo nvarchar(128). Para localizar o service_broker_guid para um banco de dados, execute a seguinte consulta no banco de dados:

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

    Para obter mais informações sobre a identidade do Service Broker, consulte Gerenciando identidades do Service Broker.

  • 'CURRENT DATABASE'
    Especifica que a conversação usa o service_broker_guid para o banco de dados atual.

  • ON CONTRACT contract_name
    Especifica o contrato que essa conversação segue. O contrato deve existir no banco de dados atual. Se o serviço de destino não aceitar novas conversações no contrato especificado, o Service Broker retornará uma mensagem de erro na conversação. Quando essa cláusula é omitida, a conversação segue o contrato chamado DEFAULT.

  • RELATED_CONVERSATION **=**related_conversation_handle
    Especifica o grupo de conversação existente ao qual a nova caixa de diálogo é adicionada. Quando esta cláusula estiver presente, a caixa de diálogo pertencerá ao mesmo grupo de conversação que a caixa de diálogo especificada por related_conversation_handle. O related_conversation_handledeve ser de um tipo implicitamente conversível para o tipo uniqueidentifier. A instrução falhará se o related_conversation_handle não fizer referência a uma caixa de diálogo existente.

  • RELATED_CONVERSATION_GROUP **=**related_conversation_group_id
    Especifica o grupo de conversação existente ao qual a nova caixa de diálogo é adicionada. Quando esta cláusula estiver presente, a nova caixa de diálogo será adicionada ao grupo de conversação especificado por related_conversation_group_id. A related_conversation_group_iddeve ser de um tipo implicitamente conversível para o tipo uniqueidentifier. Se related_conversation_group_idnão referenciar um grupo de conversação existente, o Agente de Serviços criará um novo grupo de conversação com a related_conversation_group_id especificada e relacionará a nova caixa de diálogo a esse grupo.

  • LIFETIME **=**dialog_lifetime
    Especifica o limite máximo de tempo que a caixa de diálogo permanecerá aberta. Para a caixa de diálogo ser concluída com êxito, os pontos de extremidade devem finalizar explicitamente a caixa de diálogo antes que seu tempo de vida expire. O valor dialog_lifetime deve ser expresso em segundos. O tempo de vida é do tipo int. Quando nenhuma cláusula LIFETIME é especificada, o tempo de vida da caixa de diálogo é o valor máximo do tipo de dados int.

  • ENCRYPTION
    Especifica se as mensagens enviadas e recebidas nessa caixa de diálogo devem ou não ser criptografadas quando forem enviadas para for a de uma instância do Microsoft SQL Server. Uma caixa de diálogo que deve ser criptografada é uma caixa de diálogo protegida. Quando ENCRYPTION = ON e os certificados necessários para oferecer suporte à criptografia não estão configurados, o Service Broker retorna uma mensagem de erro na conversação. Se ENCRYPTION = OFF, a criptografia é usada quando uma associação de serviço remoto é configurada para o target_service_name; caso contrário, as mensagens são enviadas descriptografadas. Se esta cláusula não estiver presente, o valor padrão será ON. Para obter mais informações sobre segurança de caixa de diálogo, consulte Segurança de diálogo do Service Broker.

    ObservaçãoObservação

    As mensagens trocadas com serviços na mesma instância do SQL Server nunca são criptografadas. Entretanto, uma chave de banco de dados mestre e os certificados para a criptografia ainda serão necessários para as conversações que usam criptografia se os serviços para a conversação estiverem em bancos de dados diferentes. Isso permite que as conversações continuem caso um dos bancos de dados seja movido para uma instância enquanto a conversação estiver em andamento.

Comentários

Todas as mensagens fazem parte de uma conversação. Portanto, um serviço iniciador deve começar uma conversação com o serviço de destino antes de enviar-lhe uma mensagem. As informações especificadas na instrução BEGIN DIALOG CONVERSATION são semelhantes ao endereço em uma carta; o Service Broker usa as informações para entregar as mensagens ao serviço correto. O serviço especificado na cláusula TO SERVICE é o endereço para o qual 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 destino de uma conversação não precisa chamar BEGIN DIALOG CONVERSATION. O Service Broker cria uma conversação no banco de dados de destino quando a primeira mensagem na conversação chega do iniciador.

Ao iniciar uma caixa de diálogo, um ponto de extremidade de conversação é criado no banco de dados para o serviço iniciador, mas não uma conexão com a instância que hospeda o serviço de destino. O Service Broker não estabelece comunicação com o destino da caixa de diálogo até a primeira mensagem ser enviada.

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

O Service Broker não permite agrupamentos arbitrários de conversações. Todas as conversações em um grupo de conversação devem ter o serviço especificado na cláusula FROM como o iniciador ou o destino da conversação.

O comando da BEGIN DIALOG CONVERSATION bloqueia o grupo de conversação que contém o dialog_handle retornado. Quando o comando inclui uma cláusula RELATED_CONVERSATION_GROUP, o grupo de conversação para dialog_handle é aquele especificado no parâmetro related_conversation_group_id. Quando o comando inclui uma cláusula RELATED_CONVERSATION, o grupo de conversação para dialog_handle é aquele associado ao related_conversation_handle especificado.

BEGIN DIALOG CONVERSATION não é válido em uma função definida pelo usuário.

Permissões

Para iniciar uma caixa de diálogo, o usuário atual deve ter a permissão RECEIVE na fila para o serviço especificado na cláusula FROM do comando e a permissão REFERENCES para o contrato especificado.

Exemplos

O exemplo a seguir inicia uma conversação de caixa de diálogo e armazena um identificador para a caixa de diálogo no @dialog_handle. O serviço //Adventure-Works.com/ExpenseClient é o iniciador e o serviço //Adventure-Works.com/Expenses é o destino da caixa de diálogo. A caixa de 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. Iniciando uma caixa de diálogo com um tempo de vida explícito

O exemplo a seguir inicia uma conversação de caixa de diálogo e armazena um identificador para a caixa de diálogo em @dialog_handle. O serviço //Adventure-Works.com/ExpenseClient é o iniciador da caixa de diálogo e o serviço //Adventure-Works.com/Expenses é o destino da caixa de diálogo. A caixa de diálogo segue o contrato //Adventure-Works.com/Expenses/ExpenseSubmission. Se a caixa de diálogo não for fechada pelo comando END CONVERSATION em 60 segundos, o agente a encerrará 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. Iniciando uma caixa de diálogo com uma instância de agente específica

O exemplo a seguir inicia uma conversação de caixa de diálogo e armazena um identificador para a caixa de diálogo em @dialog_handle. O serviço //Adventure-Works.com/ExpenseClient é o iniciador da caixa de diálogo e o serviço //Adventure-Works.com/Expenses é o destino da caixa de diálogo. A caixa de diálogo segue o contrato //Adventure-Works.com/Expenses/ExpenseSubmission. O agente roteia as mensagens dessa caixa de diálogo para o agente 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. Iniciando uma caixa de diálogo e relacionando-a com um grupo de conversação existente

O exemplo a seguir inicia uma conversação de caixa de diálogo e armazena um identificador para a caixa de diálogo em @dialog_handle. O serviço //Adventure-Works.com/ExpenseClient é o iniciador da caixa de diálogo e o serviço //Adventure-Works.com/Expenses é o destino da caixa de diálogo. A caixa de diálogo segue o contrato //Adventure-Works.com/Expenses/ExpenseSubmission. O agente associa a caixa de diálogo ao grupo de conversação identificado através do @conversation_group_id em vez de criar um novo grupo de conversação.

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. Iniciando uma caixa de diálogo com um tempo de vida explícito e relacionando-a a uma conversação existente

O exemplo a seguir inicia uma conversação de caixa de diálogo e armazena um identificador para a caixa de diálogo em @dialog_handle. O serviço //Adventure-Works.com/ExpenseClient é o iniciador da caixa de diálogo e o serviço //Adventure-Works.com/Expenses é o destino da caixa de diálogo. A caixa de diálogo segue o contrato //Adventure-Works.com/Expenses/ExpenseSubmission. A nova caixa de diálogo pertence ao mesmo grupo de conversação ao qual @existing_conversation_handle pertence. Se a caixa de diálogo não for fechada pelo comando END CONVERSATION em 600 segundos, o Service Broker a encerrará 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. Iniciando uma caixa de diálogo com criptografia opcional

O exemplo a seguir inicia uma caixa de diálogo e armazena um identificador para ela em @dialog_handle. O serviço //Adventure-Works.com/ExpenseClient é o iniciador da caixa de diálogo e o serviço //Adventure-Works.com/Expenses é o destino da caixa de diálogo. A caixa de diálogo segue o contrato //Adventure-Works.com/Expenses/ExpenseSubmission. A conversação neste exemplo permite que a mensagem passe pela rede sem criptografia se ela 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 ;