24

我有啓用Service Broker的DataBase。然後,我想從其他數據庫的備份恢復我的數據庫中的程序,但恢復(我恢復現有的數據庫名)之後,我的方法,whitch使服務代理,把這個錯誤:恢復Sql Server數據庫後啓用代理

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. 

這是我的方法:

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

我應該怎麼解決?有什麼建議嗎?

回答

5

我找到了但─一個非常簡單的解決方案只是simlpy分配新的服務代理,像這樣:

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

終止進程是活潑和殺戮不一定立竿見影。更好地使用'WITH ROLLBACK IMMEDIATE'。 – usr 2017-08-16 13:13:16

8

每個數據庫都有一個由Service Broker使用的唯一ID。這個ID在Sql Server實例中的所有數據庫中必須是唯一的(當然,它應該是全局唯一的,但Sql Server沒有辦法強制執行)。還原數據庫時,可以選擇在還原的數據庫中禁用Service Broker,並使用備份數據庫的GUID啓用它(以便它可以接管來自備份數據庫的消息處理),或爲其分配新的GUID 。您正在嘗試執行第二個選項,而您仍舊擁有舊的數據庫,並且遇到GUID衝突。

有關更多信息,請參閱here

57

保持記下這些選項

ALTER DATABASE mydb SET ENABLE_BROKER 

ALTER DATABASE mydb SET DISABLE_BROKER 

ALTER DATABASE mydb SET NEW_BROKER 

如果youre得到這樣的事情是已經啓用了具有相同ID的Service Broker,請參閱NEW_BROKER

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

這將創建新的服務中介

0

運行此查詢以找出哪些其他數據庫正在使用與您正在使用的數據庫相同的服務代理(例如,一個名爲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'); 

... ...回報

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 

然後運行下面的查詢,以獲得新的經紀人爲您的數據庫...

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

再次運行第一個查詢,您的數據庫應該是列表中唯一的數據庫...

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

...現在返回...

name, is_broker_enabled, service_broker_guid 
DATABASE_NAME, 1, ASJCBUHBC-7UIOSUI-IUGGUI87-IUGHUIG 
相關問題