24

J'ai une base de données avec Service Broker activé. Ensuite, je veux restaurer ma base de données dans le programme de sauvegarde d'autres bases de données, mais après la restauration (je ramènerai sur le nom de la base de données existante), ma méthode, whitch permet Service Broker, met cette erreur:Activation du courtier après la restauration de Sql Server DataBase

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. 

Ceci est ma méthode :

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

Que dois-je réparer ici? Des suggestions?

Répondre

5

J'ai trouvé une solution très simple pour that- simplement simlpy attribuer nouveau courtier de services, comme celui-ci:

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

Tuer processus est racé et le meurtre est pas nécessairement immédiate. Mieux utiliser «WITH ROLLBACK IMMEDIATE». – usr

8

Chaque base de données possède un ID unique utilisé par Service Broker. Cet ID doit être unique dans toutes les bases de données d'une instance de Sql Server (il doit être unique au niveau mondial, mais Sql Server n'a aucun moyen de le faire). Lorsque vous restaurez une base de données, vous pouvez désactiver Service Broker dans la base de données restaurée, l'activer avec le GUID de la base de données sauvegardée (pour pouvoir prendre en charge le traitement des messages depuis la base de données sauvegardée) ou lui affecter un nouveau GUID. . Vous essayez de faire la deuxième option pendant que vous avez toujours l'ancienne base de données autour et vous rencontrez un conflit GUID.

Voir here pour plus d'informations.

57

garder une note de ces options

ALTER DATABASE mydb SET ENABLE_BROKER 

ALTER DATABASE mydb SET DISABLE_BROKER 

ALTER DATABASE mydb SET NEW_BROKER 

si vous êtes obtenir quelque chose comme ceci est déjà un Service Broker activé avec le même ID, optez pour le NEW_BROKER

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

créer le nouveau courtier de services

0

Exécutez cette requête pour déterminer quelles autres bases de données utilisent le même courtier de services que la base de données que vous utilisez (par ex. pour une base de données appelée 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'); 

... Les retours ...

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 

Ensuite, exécutez les requêtes suivantes pour obtenir un nouveau courtier pour votre base de données ...

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

Exécutez à nouveau la première requête et votre base de données devrait être le seul dans la liste ...

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'); 

... maintenant retourne ...

name, is_broker_enabled, service_broker_guid 
DATABASE_NAME, 1, ASJCBUHBC-7UIOSUI-IUGGUI87-IUGHUIG 
Questions connexes