BEGIN DIALOG CONVERSATION (Transact-SQL)
Se aplica a: SQL Server Azure SQL Managed Instance
Inicia un diálogo de un servicio a otro servicio. Un diálogo es una conversación que proporciona una función de mensajería exactamente una vez por orden entre dos servicios.
Convenciones de sintaxis de Transact-SQL
Sintaxis
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
Se trata de una variable utilizada para almacenar el identificador de diálogo generado por el sistema para el nuevo diálogo devuelto por la instrucción BEGIN DIALOG CONVERSATION. La variable debe ser de tipo uniqueidentifier.
FROM SERVICE initiator_service_name
Especifica el servicio que inicia el diálogo. El nombre especificado debe ser el nombre de un servicio de la base de datos actual. La cola especificada para el servicio iniciador recibe los mensajes devueltos por el servicio de destino y los mensajes creados por Service Broker para esta conversación.
TO SERVICE 'target_service_name'
Especifica el servicio de destino con el se inicia el diálogo. target_service_name es de tipo nvarchar(256). Service Broker usa una comparación byte a byte para buscar una coincidencia con la cadena target_service_name. Es decir, la comparación distingue mayúsculas de minúsculas y no tiene en cuenta la intercalación actual.
service_broker_guid
Especifica la base de datos que hospeda el servicio de destino. Si hay varias bases de datos que hospedan una instancia del servicio de destino, puede comunicarse con una base de datos específica si proporciona service_broker_guid.
service_broker_guid es de tipo nvarchar(128). Para buscar el service_broker_guid de una base de datos, ejecute la siguiente consulta en la base de datos:
SELECT service_broker_guid
FROM sys.databases
WHERE database_id = DB_ID() ;
Nota
Esta opción no está disponible en las bases de datos independientes.
'CURRENT DATABASE'
Especifica que la conversación debe usar el service_broker_guid de la base de datos actual.
ON CONTRACT contract_name
Especifica el contrato que sigue la conversación. El contrato debe existir en la base de datos actual. Si el servicio de destino no acepta conversaciones nuevas en el contrato especificado, Service Broker devuelve un mensaje de error en la conversación. Si se omite esta cláusula, la conversación sigue el contrato llamado DEFAULT.
RELATED_CONVERSATION =related_conversation_handle
Especifica el grupo de conversación existente al que se agrega el diálogo nuevo. Si esta cláusula está presente, el diálogo nuevo pertenece al mismo grupo de conversación que el diálogo especificado por related_conversation_handle. related_conversation_handle debe ser de un tipo que se pueda convertir implícitamente al tipo uniqueidentifier. La instrucción genera un error si related_conversation_handle no hace referencia a un diálogo existente.
RELATED_CONVERSATION_GROUP =related_conversation_group_id
Especifica el grupo de conversación existente al que se agrega el diálogo nuevo. Si esta cláusula está presente, el nuevo diálogo se agrega al grupo de conversación especificado por related_conversation_group_id. related_conversation_group_id debe ser de un tipo que se pueda convertir implícitamente al tipo uniqueidentifier. Si related_conversation_group_id no hace referencia a un grupo de conversación existente, Service Broker crea un grupo de conversación nuevo con la especificación de related_conversation_group_id y relaciona el diálogo nuevo con dicho grupo de conversación.
LIFETIME =dialog_lifetime
Especifica la cantidad máxima de tiempo durante el que el diálogo permanece abierto. Para que el diálogo finalice correctamente, ambos extremos deben finalizar explícitamente el diálogo antes del final de la vigencia. El valor de dialog_lifetime se debe expresar en segundos. LIFETIME es de tipo int. Si no se especifica la cláusula LIFETIME, la vigencia del diálogo equivale al valor máximo del tipo de datos int.
ENCRYPTION
Especifica si se deben cifrar o no los mensajes enviados y recibidos en este diálogo en caso de enviarse fuera de una instancia de Microsoft SQL Server. Un diálogo que se debe cifrar es un diálogo protegido. Si no se han configurado ENCRYPTION = ON y los certificados necesarios para admitir el cifrado, Service Broker devuelve un mensaje de error en la conversación. Si ENCRYPTION = OFF, el cifrado se usa si se ha configurado un enlace de servicio remoto para target_service_name; en caso contrario, los mensajes se envían sin cifrar. Si no está presente esta cláusula, el valor predeterminado es ON.
Nota
Los mensajes intercambiados con servicios en la misma instancia de SQL Server no se cifran en ningún caso. No obstante, la clave maestra de la base de datos y los certificados de cifrado siguen siendo necesarios para las conversaciones que utilizan el cifrado si los servicios para la conversación están en distintas bases de datos. Esto permite que las conversaciones continúen en caso de que una de las bases de datos se mueva a otra instancia mientras la conversación está en curso.
Observaciones
Todos los mensajes forman parte de una conversación. Por lo tanto, el servicio iniciador debe iniciar una conversación con el servicio de destino antes de enviar un mensaje al servicio de destino. La información especificada en la instrucción BEGIN DIALOG CONVERSATION es similar a la dirección de una carta; Service Broker utiliza la información para entregar mensajes al servicio correcto. El servicio especificado en la cláusula TO SERVICE es la dirección a la que se envían los mensajes. El servicio especificado en la cláusula FROM SERVICE es la dirección de retorno utilizada para responder a los mensajes.
El destino de una conversación no necesita llamar a BEGIN DIALOG CONVERSATION. Service Broker crea una conversación en la base de datos de destino cuando llega del iniciador el primer mensaje de la conversación.
Al iniciarse un diálogo se crea un extremo de conversación en la base de datos para el servicio iniciador, pero no se crea una conexión de red a la instancia que hospeda el servicio de destino. Service Broker no establecerá comunicación con el destino del diálogo hasta que se haya enviado el primer mensaje.
Si la instrucción BEGIN DIALOG CONVERSATION no especifica ninguna conversación o ningún grupo de conversación relacionado, Service Broker crea otro grupo de conversación para la conversación nueva.
Service Broker no permite agrupaciones arbitrarias de conversaciones. Todas las conversaciones de un grupo de conversación deben tener el servicio especificado en la cláusula FROM como iniciador o como destino de la conversación.
El comando BEGIN DIALOG CONVERSATION bloquea el grupo de conversación que contiene la devolución de dialog_handle. Si el comando incluye una cláusula RELATED_CONVERSATION_GROUP, el grupo de conversación para dialog_handle es el grupo de conversación especificado en el parámetro related_conversation_group_id. Si el comando incluye una cláusula RELATED_CONVERSATION, el grupo de conversación para dialog_handle es el grupo de conversación asociado al related_conversation_handle especificado.
BEGIN DIALOG CONVERSATION no tiene validez en una función definida por el usuario.
Permisos
Para iniciar un diálogo, el usuario actual debe tener el permiso RECEIVE en la cola para el servicio especificado en la cláusula FROM del comando y el permiso REFERENCES para el contrato especificado.
Ejemplos
A. Iniciar un diálogo
El ejemplo siguiente comienza una conversación del diálogo y almacena un identificador para el diálogo en @dialog_handle.
El servicio //Adventure-Works.com/ExpenseClient
es el iniciador para el diálogo, y el servicio //Adventure-Works.com/Expenses
es el destino del diálogo. El diálogo sigue el 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 un diálogo con una vigencia explícita
En el ejemplo siguiente se inicia una conversación de diálogo y se almacena un identificador para el diálogo en @dialog_handle
. El servicio //Adventure-Works.com/ExpenseClient
es el iniciador del diálogo y el servicio //Adventure-Works.com/Expenses
es el destino del diálogo. El diálogo sigue el contrato //Adventure-Works.com/Expenses/ExpenseSubmission
. Si el diálogo no se ha cerrado mediante el comando END CONVERSATION en 60
segundos, el broker finaliza el diálogo con un error.
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 un diálogo con una instancia de broker específica
En el ejemplo siguiente se inicia una conversación de diálogo y se almacena un identificador para el diálogo en @dialog_handle
. El servicio //Adventure-Works.com/ExpenseClient
es el iniciador del diálogo y el servicio //Adventure-Works.com/Expenses
es el destino del diálogo. El diálogo sigue el contrato //Adventure-Works.com/Expenses/ExpenseSubmission
. El broker enruta mensajes de este diálogo al broker identificado por el 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 un diálogo y relacionarlo con un grupo de conversación existente
En el ejemplo siguiente se inicia una conversación de diálogo y se almacena un identificador para el diálogo en @dialog_handle
. El servicio //Adventure-Works.com/ExpenseClient
es el iniciador del diálogo y el servicio //Adventure-Works.com/Expenses
es el destino del diálogo. El diálogo sigue el contrato //Adventure-Works.com/Expenses/ExpenseSubmission
. El broker asocia el diálogo al grupo de conversación identificado por @conversation_group_id
en lugar de crear un grupo de conversación.
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. Iniciar un diálogo con una vigencia explícita y relacionarlo con una conversación existente
En el ejemplo siguiente se inicia una conversación de diálogo y se almacena un identificador para el diálogo en @dialog_handle
. El servicio //Adventure-Works.com/ExpenseClient
es el iniciador del diálogo y el servicio //Adventure-Works.com/Expenses
es el destino del diálogo. El diálogo sigue el contrato //Adventure-Works.com/Expenses/ExpenseSubmission
. El nuevo diálogo pertenece al mismo grupo de conversación al que pertenece @existing_conversation_handle
. Si el diálogo no se ha cerrado mediante el comando END CONVERSATION en 600
segundos, Service Broker finaliza el diálogo con un error.
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 un diálogo con cifrado opcional
En el ejemplo siguiente se inicia un diálogo y se almacena un identificador para el diálogo en @dialog_handle
. El servicio //Adventure-Works.com/ExpenseClient
es el iniciador del diálogo y el servicio //Adventure-Works.com/Expenses
es el destino del diálogo. El diálogo sigue el contrato //Adventure-Works.com/Expenses/ExpenseSubmission
. La conversación de este ejemplo permite que el mensaje viaje por la red sin cifrado en caso de no estar disponible.
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 también
BEGIN CONVERSATION TIMER (Transact-SQL)
END CONVERSATION (Transact-SQL)
MOVE CONVERSATION (Transact-SQL)
sys.conversation_endpoints (Transact-SQL)