关于数据库恢复后Service Broker不能使用的问题

来源:互联网 发布:appscan sql文件注入 编辑:程序博客网 时间:2024/06/05 03:06
如果我们在服务器A上有一个数据库DB1,该数据库启用了Service Broker并部署了消息队列,我们把DB1备份后到服务器B上进行恢复,假设恢复后的数据库为DB2,这时我们会发现DB2上的Service broker不起作用了。

BOL上有这么一段话:

Service Broker 标识符在同一网络上的所有实例中应是唯一的。否则,消息可能被误传。

那么怎么能让数据库DB2也能使用Service Broker呢?方法很简单:

第1种方法是在Restore database 语句里指明New_Broker选项;
第2种方法是在恢复后的数据库里执行:

ALTER DATABASE DB2 SET NEW_BROKER
ALTER DATABASE DB2 SET ENABLE_BROKER


这样就可以启用DB2的Service Broker了。

如果此时还不能启用,请查看一下SQL Server的日志,如果显示下面的信息:

An exception occurred while enqueueing a message in the target queue. Error: 15517, State: 1. Cannot execute as the database principal because the principal "dbo" does not exist, this type of principal cannot be impersonated, or you do not have permission.

这是因为最初创建数据库的Windows用户不再可用的缘故,所以需要改变数据库的拥有者到一个合法的登录,因此执行下面的语句后才能启用DB2的Service Broker:

ALTER AUTHORIZATION  ON DATABASE::DB2    TO sa;

这里需要把DB2改为你自己的数据库名称即可。

另外,你也可以使用sp_changedbowner来更改该数据库的拥有者,不过还是建议你使用上面的方法。sp_changedbowner可能会在以后的版本里不再提供。


注意:

启动任何数据库中的 SQL Server Service Broker 都需要数据库锁。所以当有其他用户连到数据库后,你可能需要等待这些用户断开后才能开启Service Broker,在此期间会一直等待。

若要启动 msdb 数据库中的 Service Broker,首先请停止 SQL Server 代理,这样 Service Broker 才能获得必需的锁。

 

From: http://www.windbi.com/showtopic-789.aspx