BEGIN DIALOG CONVERSATION (Transact-SQL)
Inicia uma caixa de diálogo de um serviço para outro. Uma caixa de diálogo é uma conversa que fornece mensagens exatamente na mesma ordem entre dois serviços.
Convenções da 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 Service Broker para essa conversa.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). Service Broker usa uma comparação byte a byte para correspondência com a 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() ;
Observação Essa opção não está disponível em um banco de dados independente.
'CURRENT DATABASE'
Especifica que a conversa usa o service_broker_guid para o banco de dados atual.ON CONTRACT contract_name
Especifica o contrato que essa conversa segue. O contrato deve existir no banco de dados atual. Se o serviço de destino não aceitar novas conversas no contrato especificado, o Service Broker retornará uma mensagem de erro na conversa. Quando essa cláusula é omitida, a conversa segue o contrato chamado DEFAULT.RELATED_CONVERSATION **=**related_conversation_handle
Especifica o grupo de conversa 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 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 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 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 existente, o Service Broker criará um novo grupo de conversa 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. Se ENCRYPTION = OFF, a criptografia será usada se uma associação de serviço remoto estiver configurada para o target_service_name; caso contrário, as mensagens serão enviadas descriptografadas. Se esta cláusula não estiver presente, o valor padrão será ON.Observaçã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 conversas que usam criptografia se os serviços para a conversa estiverem em bancos de dados diferentes. Isso permite que as conversas continuem caso um dos bancos de dados seja movido para uma instância enquanto a conversa estiver em andamento.
Comentários
Todas as mensagens fazem parte de uma conversa. Portanto, um serviço iniciador deve começar uma conversa 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 não precisa chamar BEGIN DIALOG CONVERSATION. O Service Broker cria uma conversa no banco de dados de destino quando a primeira mensagem da conversa chega do iniciador.
O início de uma caixa de diálogo cria um ponto de extremidade de conversa no banco de dados para o serviço iniciador, mas não cria uma conexão de rede à 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é que a primeira mensagem seja enviada.
Quando a instrução BEGIN DIALOG CONVERSATION não especifica uma conversa relacionada ou um grupo de conversa relacionado, o Service Broker cria um novo grupo de conversa para a nova conversa.
O Service Broker não permite agrupamentos arbitrários de conversas. Todas as conversas em um grupo de conversa devem ter o serviço especificado na cláusula FROM como o iniciador ou o destino da conversa.
O comando da BEGIN DIALOG CONVERSATION bloqueia o grupo de conversa que contém o dialog_handle retornado. Quando o comando inclui uma cláusula RELATED_CONVERSATION_GROUP, o grupo de conversa 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 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
A.Iniciando uma caixa de diálogo
O exemplo a seguir inicia uma conversa 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 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 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 existente
O exemplo a seguir inicia uma conversa 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 identificado através do @conversation\_group\_id em 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.Iniciando uma caixa de diálogo com um tempo de vida explícito e relacionando-a a uma conversa existente
O exemplo a seguir inicia uma conversa 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 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 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 ;
Consulte também
Referência
BEGIN CONVERSATION TIMER (Transact-SQL)
END CONVERSATION (Transact-SQL)