24

Ich habe DataBase mit aktiviertem Service Broker. Dann will ich meine Datenbank in Programm aus der Sicherung von anderer Datenbank wiederherstellen, aber nach der Wiederherstellung (I wiederherstellen auf bestehenden Datenbanknamen), meine Methode, whitch Service Broker ermöglicht, setzt diesen Fehler:Aktivieren von Broker nach dem Wiederherstellen von 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. 

Dies ist meine Methode :

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

Was soll ich hier reparieren? Irgendwelche Vorschläge?

Antwort

5

fand ich eine sehr einfache Lösung für dass- simlpy nur neue Service-Broker zuweisen, wie folgt aus:

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

Prozesse zu töten ist rassig und Töten ist nicht unbedingt sofort. Besser verwenden Sie 'MIT ROLLBACK IMMEDIATE'. – usr

8

Jede Datenbank hat eine eindeutige ID, die von Service Broker verwendet wird. Diese ID muss für alle Datenbanken in einer Sql Server-Instanz eindeutig sein (sie sollte global eindeutig sein, aber Sql Server kann dies nicht erzwingen). Wenn Sie eine Datenbank wiederherstellen, haben Sie die Möglichkeit, Service Broker in der wiederhergestellten Datenbank zu deaktivieren, indem Sie sie mit der GUID der gesicherten Datenbank aktivieren (damit sie die Nachrichtenverarbeitung aus der gesicherten Datenbank übernehmen kann) oder ihr eine neue GUID zuweisen . Sie versuchen, die zweite Option auszuführen, während die alte Datenbank noch vorhanden ist und Sie in einen GUID-Konflikt geraten.

Weitere Informationen finden Sie unter here.

57

halten eine Notiz dieser Optionen

ALTER DATABASE mydb SET ENABLE_BROKER 

ALTER DATABASE mydb SET DISABLE_BROKER 

ALTER DATABASE mydb SET NEW_BROKER 

wenn youre so etwas wie dieses immer ist bereits ein aktivierter Service Broker mit der gleichen ID, gehen Sie für die NEW_BROKER

20

Dies wird Erstellen Sie den neuen Service Broker

0

Führen Sie diese Abfrage aus, um herauszufinden, welche anderen Datenbanken denselben Service Broker wie die von Ihnen verwendete Datenbank verwenden (z. für eine Datenbank 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'); 

... kehrt ...

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 

Dann führen Sie die folgenden Abfragen einen neuen Broker für Ihre Datenbank mit dem Namen zu erhalten ...

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

Führen Sie die erste Abfrage erneut und Ihre Datenbank sollte das einzige in der 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'); 

... jetzt gibt ...

name, is_broker_enabled, service_broker_guid 
DATABASE_NAME, 1, ASJCBUHBC-7UIOSUI-IUGGUI87-IUGHUIG 
Verwandte Themen