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