¿Cómo utilizar ssbdiagnose para depurar un Service Broker?

MSSQL, Service Broker Add comments

En un artículo anterior, expliqué los pasos básicos para instalar un Service Broker. Por su naturaleza asíncrona, no siempre es fácil depurar errores de dicho Servicio. Además, varios componentes están involucrados en el buen funcionamiento del proceso: cola de mensajes, mensajes, contratos, servicios de emisión y de recepción, stored procedure de activación, etc. Para poder depurar el Service Broker, existe la herramienta “ssbdiagnose”. Esta utilidad sirve parta detectar problemas que ocurren en conversaciones o en la configuración del Service Broker. Es bastante sencillo usarla, funciona para servidor locales como remotos. Si tienes Sql Server 2005 o 2008 instalado, ssbdiagnose se encuentra en:

C:\Program Files\Microsoft SQL Server\100\Tools\Binn

Se dispara una diagnostico con el siguiente comando:

ssbdiagnose -XML -E -S ".\SQLEXPRESS" -d service_broker_db CONFIGURATION FROM SERVICE ServicioEmisor TO SERVICE ServicioRecepcion ON CONTRACT ContratoCalculoPosiciones > C:\sbOutputXML.xml

El parámetro -XML indica que la salida será en el formato XML y se podrá consultar en el archivo C:\sbOutputXML.xml. El parámetro -E avisa que se usarán las credenciales windows del usuario actualmente logeado para conectarse a la instancia de la base de datos service_broker_db. Las demás instrucciones sirven para mandar un mensaje del servicio de emisión hacia el servicio de recepción usando el contrato ‘ContratoCalculoPosiciones’.

Cuando levanté por primera vez una instancia del Service Broker, por alguna razón los mensajes de la cola nunca se procesaban. Usando ’ssbdiagnose’ descubrí dos problemas bastante graves. Resolviéndolos pude hacer funcionar mi instancia. El primer error que me arrojó fue:

<Issue code="29997" level="Error" type="Diagnosis" server=".\SQLEXPRESS" database="service_broker_db ">Service Broker GUID is identical to that of database service_broker_db on server .\SQLEXPRESS</Issue>

El error indica que el Globally Unique Identifier del Service Broker está duplicado en la base de datos. Para visualizar los GUID de todos los Service Broker, ejecuta el siguiente query:

SELECT
name
,is_broker_enabled
,is_honor_broker_priority_on
,is_trustworthy_on
,service_broker_guid
FROM sys.databases
ORDER BY service_broker_guid

Este error sucede cuando un base de datos se importa desde otro servidor. La solución consiste en regenerar el GUID del Service Broker:

ALTER DATABASE [service_broker_db] SET NEW_BROKER;

Después de generar el GUID, me encontré el siguiente error (blilingüe!):

The EXECUTE AS for the user dbo specified for activation on queue dbo.MiStoredProcedure cannot be impersonated due to an exception No se puede ejecutar como la entidad de seguridad de base de datos porque la entidad de seguridad "dbo" no existe, este tipo de entidad de seguridad no se puede suplantar o el usuario no tiene permiso.

El problema descrito aquí tiene mucho que ver con el anterior. La base de datos que usé era una copia de una base creada en otra máquina. El comando ‘EXECUTE AS’ necesita permisos para ejecutarse y no están disponibles dado que el ‘owner’ de la base no está definido correctamente. Se puede arreglar este problema de permisos con el siguiente comando:

ALTER AUTHORIZATION ON DATABASE::[service_broker_db] TO [SA];

Ya con estos dos errores arregledos, los mensajes de la cola empezaron a ser procesados por el servicio de recepción.

Se puede depurar un Service Broker “a mano” pero es mucho más complejo y largo que utilizar la herramienta “ssbdiagnose”. Espero que también les ayude en algo!

Información de MSDN sobre “ssbdiagnose”.

Leave a Reply

WP Theme & Icons by N.Design Studio
Entries RSS Comments RSS Log in