Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a: SQL Server
Azure 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)