24

Tengo una base de datos con Service Broker habilitado. A continuación, quiero restaurar mi base de datos en el programa de copia de seguridad de otra base de datos, pero después de la restauración (yo restaure el nombre de base de datos existente), mi método, générale permite Service Broker, pone este error:Habilitación del intermediario después de restaurar la base de datos del servidor Sql

Msg 9772, Level 16, State 1, Line 1 
The Service Broker in database "ServeDB2" cannot be enabled because there is already an enabled Service Broker with the same ID. 
Msg 5069, Level 16, State 1, Line 1 
ALTER DATABASE statement failed. 

Este es mi método :

public void TurnOnBroker() 
{ 
    if (!this.database.BrokerEnabled) 
    { 
     this.server.KillAllProcesses(this.database.Name); 
     this.database.BrokerEnabled = true; 
     this.database.Alter(); 
     RefreshConnection(); 
    } 
} 

¿Qué debo solucionar aquí? ¿Alguna sugerencia?

Respuesta

5

he encontrado una solución muy simple para que- acaba de asignar simlpy nuevo corredor de servicio, así:

public void TurnOnBroker() 
    { 
     if (!this.database.BrokerEnabled) 
     { 
      this.server.KillAllProcesses(this.database.Name); 

      string brokerCommand = String.Format("ALTER DATABASE {0} SET NEW_BROKER", this.database.Name); 
      this.database.ExecuteNonQuery(brokerCommand); 

      RefreshConnection(); 
     } 
    } 
+0

procesos matar es picante y el asesinato no es necesariamente inmediata. Mejor uso 'CON ROLLBACK INMEDIATO'. – usr

8

Cada base de datos tiene una ID única utilizada por Service Broker. Esta ID debe ser única en todas las bases de datos en una instancia de servidor Sql (bueno, debe ser única a nivel mundial, pero el servidor Sql no tiene forma de imponer eso). Cuando restaura una base de datos, tiene la opción de deshabilitar Service Broker en la base de datos restaurada, habilitarla con el GUID de la base de datos respaldada (para que pueda hacerse cargo del procesamiento de mensajes de la base de datos respaldada) o asignarle un nuevo GUID . Está intentando hacer la segunda opción mientras todavía tiene la base de datos anterior y se encuentra con un conflicto GUID.

Consulte here para obtener más información.

57

mantener una nota de estas opciones

ALTER DATABASE mydb SET ENABLE_BROKER 

ALTER DATABASE mydb SET DISABLE_BROKER 

ALTER DATABASE mydb SET NEW_BROKER 

si usted está recibiendo algo como esto es Ya es un Service Broker habilitado con la misma ID, vaya para NEW_BROKER

20
ALTER DATABASE [Database_name] SET NEW_BROKER WITH ROLLBACK IMMEDIATE; 

Esto lo hará crear el nuevo intermediario de servicios

0

Ejecute esta consulta para averiguar qué otras bases de datos están utilizando el mismo intermediario de servicios que la base de datos que está utilizando (p. ej. para una base de datos llamada DATABASE_NAME) ...

SELECT name, is_broker_enabled, service_broker_guid FROM sys.databases 
WHERE service_broker_guid IN (SELECT service_broker_guid FROM sys.databases where name = 'DATABASE_NAME'); 

... vuelve ...

name, is_broker_enabled, service_broker_guid 
DATABASE_NAME_OTHER, 1, KBHDBVJH-SDVHIOHD-SODIVDIOH-UHDSV 
DATABASE_NAME_ANOTHER, 0, KBHDBVJH-SDVHIOHD-SODIVDIOH-UHDSV 
DATABASE_NAME, 0, KBHDBVJH-SDVHIOHD-SODIVDIOH-UHDSV 

A continuación, ejecute las siguientes consultas para obtener un nuevo agente para su base de datos ...

ALTER DATABASE DATABASE_NAME SET SINGLE_USER WITH ROLLBACK IMMEDIATE; 
ALTER DATABASE DATABASE_NAME SET NEW_BROKER; 
ALTER DATABASE DATABASE_NAME SET MULTI_USER; 

ejecutar la primera consulta de nuevo y su base de datos debe ser el único en la lista ...

SELECT name, is_broker_enabled, service_broker_guid FROM sys.databases 
WHERE service_broker_guid IN (SELECT service_broker_guid FROM sys.databases where name = 'DATABASE_NAME'); 

... ahora vuelve ...

name, is_broker_enabled, service_broker_guid 
DATABASE_NAME, 1, ASJCBUHBC-7UIOSUI-IUGGUI87-IUGHUIG 
Cuestiones relacionadas