Administrar identidades de Service Broker

Cada base de datos contiene un identificador único que se utiliza para enrutar los mensajes de Service Broker a esa base de datos. En este tema se describen los identificadores de Service Broker, cómo protege Service Broker de los errores de envío de mensajes, y las opciones disponibles para administrar los identificadores de Service Broker.

Identificadores de Service Broker

Cada base de datos contiene un identificador de Service Broker que la distingue de todas las demás bases de datos de la red. La columna service_broker_guid de la vista de catálogo sys.databases muestra el identificador de Service Broker para cada base de datos de la instancia. Los sistemas de Service Broker pueden estar diseñados para ejecutar varias copias de un servicio. Cada copia del servicio se ejecuta en una base de datos independiente. En un sistema que tiene varias copias de un servicio, utilice la cláusula BROKER_INSTANCE de la instrucción CREATE ROUTE para crear una ruta a una copia específica del servicio.

El enrutamiento de Service Broker usa el identificador de Service Broker para asegurarse de que todos los mensajes de cada conversación se entregan a la misma base de datos. La instrucción BEGIN DIALOG CONVERSATION inicia una conversación con un servicio de destino. Si se abre correctamente una conversación, el mensaje de reconocimiento del servicio de destino contiene el identificador de Service Broker para la base de datos de destino. A continuación, Service Broker enruta todos los mensajes de la conversación a la base de datos especificada.

Los identificadores de Service Broker se pueden especificar en la cláusula TO SERVICE de la instrucción BEGIN DIALOG CONVERSATION para controlar el tipo de enrutamiento que debe realizarse:

  • Para enrutar las conversaciones a una copia específica de un servicio, especifique un service_broker_guid. Por ejemplo, puede tener tres copias de un servicio en tres bases de datos de la red: una base de datos de desarrollo, una base de datos de prueba y una base de datos de producción. Las instrucciones BEGIN DIALOG CONVERSATION de cada sistema deben especificar un service_broker_guid para asegurarse de que todos los mensajes se dirigen a la base de datos correcta.

  • Para permitir que Service Broker equilibre la carga de conversaciones entre varias copias de un servicio, no especifique un service_broker_guid. Service Broker irá eligiendo alternativamente entre las rutas que comparten el mismo nombre de servicio especificado en la cláusula TO SERVICE de BEGIN DIALOG CONVERSATION.

De forma predeterminada, si sólo hay una copia de un servicio en una red, Service Broker enruta las conversaciones correctamente. No es necesario que especifique el identificador de Service Broker en las instrucciones CREATE ROUTE o BEGIN DIALOG CONVERSATION.

Para obtener más información acerca de la coincidencia de rutas de Service Broker, vea Enrutamiento de Service Broker.

Para admitir correctamente la entrega de los mensajes, cada identificador de Service Broker debe ser único en todas las instancias de Database Engine (Motor de base de datos) de la misma red. De lo contrario, los mensajes podrían enviarse a un destino incorrecto. Cuando se crea una nueva base de datos, se le asigna un nuevo identificador de Service Broker que debe ser único en la red. El identificador se restaura cuando la base de datos se restaura o se adjunta. Tenga cuidado al restaurar y adjuntar bases de datos. No debe tener varias bases de datos que estén realizando activamente operaciones de Service Broker y que utilicen los mismos identificadores.

Entrega de mensajes de Service Broker

SQL Server proporciona un mecanismo para desactivar la entrega de mensajes de Service Broker en una base de datos si tiene el mismo identificador de Service Broker que otra base de datos de la misma red. Cuando se desactiva la entrega de mensajes en una base de datos, todos los mensajes enviados desde esa base de datos permanecen en la cola de transmisión de la base de datos. Además, Service Broker no considera los servicios de esa base de datos como disponibles para recibir mensajes. Estos servicios no se tienen en cuenta cuando el enrutamiento de Service Broker busca un servicio de destino en una instancia.

La desactivación de la entrega de mensajes de Service Broker permite adjuntar una copia de seguridad de una base de datos de forma segura para solucionar problemas o para recuperar datos sin correr el riesgo de que se envíen mensajes incorrectamente. La columna is_broker_enabled de sys.databases muestra el estado actual de la entrega de mensajes de Service Broker en cada base de datos.

Cuando adjunte o restaure una base de datos, debe asegurarse de que sólo una base de datos con un identificador de Service Broker determinado tiene activada la entrega de mensajes. De lo contrario, los mensajes podrían enviarse incorrectamente y el procesamiento de una conversación podría producirse en la copia incorrecta de la base de datos.

Administrar identificadores y entrega de mensajes

Los comandos CREATE DATABASE, ALTER DATABASE y RESTORE DATABASE contienen opciones para activar la entrega de mensajes de Service Broker. También contienen opciones para cambiar el identificador de Service Broker para una base de datos.

De forma predeterminada, cuando se adjunta o se restaura una base de datos, el identificador y el estado de entrega de mensajes de Service Broker no cambian. Normalmente, no se debe cambiar el identificador de Service Broker en las situaciones siguientes:

  • Al restaurar una copia de seguridad para recuperar la base de datos.

  • Al configurar un par reflejado.

  • Al configurar el trasvase de registros para un servidor en espera. Si realiza una copia de la base de datos, debe cambiar el identificador de la instancia.

Existen cuatro opciones para administrar los identificadores y la entrega de mensajes:

  • ENABLE_BROKER. Esta opción activa la entrega de mensajes de Service Broker, conservando el identificador de Service Broker existente para la base de datos.

    [!NOTA]

    La habilitación de SQL ServerService Broker en una base de datos requiere un bloqueo de base de datos. Para habilitar Service Broker en la base de datos msdb, primero detenga el Agente SQL Server. A continuación, Service Broker puede obtener el bloqueo necesario.

  • DISABLE_BROKER. Esta opción desactiva la entrega de mensajes de Service Broker, conservando el identificador de Service Broker existente para la base de datos.

  • NEW_BROKER. Esta opción activa la entrega de mensajes de Service Broker y crea un nuevo identificador de Service Broker para la base de datos. Además, esta opción finaliza todas las conversaciones existentes en la base de datos y devuelve un error para cada conversación. Esto se debe a que estas conversaciones no utilizan el nuevo identificador. Es preciso volver a crear con el nuevo identificador cualquier ruta que haga referencia al identificador de Service Broker anterior.

  • ERROR_BROKER_CONVERSATIONS. Esta opción activa la entrega de mensajes de Service Broker, conservando el identificador de Service Broker existente para la base de datos. Service Broker finaliza todas las conversaciones de la base de datos y devuelve un error para cada conversación. Esta opción se utiliza normalmente cuando es necesario restaurar una base de datos a un momento diferente del de otras bases de datos con las que tiene conversaciones abiertas. Todas las conversaciones de la base de datos restaurada deben finalizar con un error porque ahora no están sincronizadas con las demás bases de datos. El identificador de Service Broker se conserva para que todas las rutas que hacen referencia al identificador sigan siendo válidas.

Independientemente de la opción especificada, SQL Server no permite que dos bases de datos con el mismo identificador de Service Broker tengan activada la entrega de mensajes en la misma instancia de SQL Server. Si adjunta una base de datos que tiene el mismo identificador de Service Broker que una base de datos existente, SQL Server desactiva la entrega de mensajes de Service Broker en la base de datos que se va a adjuntar.

Para obtener más información sobre las opciones para adjuntar bases de datos, vea CREATE DATABASE (Transact-SQL) y ALTER DATABASE (Transact-SQL). Para obtener información sobre cómo activar la entrega de mensajes de Service Broker en una base de datos, vea Cómo activar la entrega de mensajes de Service Broker en las bases de datos (Transact-SQL).