Service Broker主密钥的要求

时间:2010-12-08 21:08:18

标签: sql-server service-broker

我已阅读各种MSDN页面和SQL Server博客,其中“通常”是Service Broker数据库中需要的主密钥。

的确,在尝试接收消息时,我收到以下应用程序事件日志消息:

  

Service Broker需要访问   数据库中的主密钥   'MDR_REPLICATION_Z'。错误代码:26。   主密钥必须存在和   服务主密钥加密是   必需的。

让我感到困惑的是,当我所有的CONVERSATION都加密= OFF时,为什么会这样。

有没有办法在ENCYRPTION为OFF的单个数据库内部使用Service Broker,而无需创建数据库主密钥?

3 个答案:

答案 0 :(得分:3)

来自Service Broker Dialog Security

  

Service Broker对话框安全性允许   你的应用使用认证,   授权或加密   个人对话(或   对话)。默认情况下,所有对话框   对话使用对话安全性。   当您开始对话时,您可以   明确允许对话继续   通过包括没有对话安全性   关于的ENCRYPTION = OFF子句   BEGIN DIALOG CONVERSATION声明。   但是,如果是远程服务绑定   存在的服务是   对话目标,对话框使用   即使在ENCRYPTION = OFF时安全。

换句话说,请确保您没有任何匹配的远程服务绑定。

答案 1 :(得分:3)

替代方案是为服务代理创建主密钥

首先通过右键单击队列和查看传输队列来检查服务代理队列 或者只是使用这个查询

SELECT  *, casted_message_body = CASE message_type_name WHEN 'X' 
    THEN CAST(message_body AS NVARCHAR(MAX)) 
    ELSE message_body 
END 
FROM [DATABASE_NAME].[sys].[transmission_queue]

如果你在这里找到任何数据,那么transmission_status列就有了这个原因。

如果经纪人没有扮演其角色,我会使用以下查询创建NEW_BROKER

USE [master] 
ALTER DATABASE [DATABASE_NAME] SET NEW_BROKER

然后启用BROKER并将TRUSTWORTHY设置为ON

ALTER DATABASE DATABASE_NAME SET ENABLE_BROKER;
ALTER DATABASE DATABASE_NAME SET TRUSTWORTHY ON;

最后,删除主密钥并创建新主密钥并使用新密码进行加密:

ALTER AUTHORIZATION ON DATABASE::DATABASE_NAME TO [SA];
DROP MASTER KEY
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '79HGKJ67ghjgk^&*^fgj'
GO

密码可以是用户定义的字母数字和符号的混合。

如果上述任何步骤需要较长时间才能运行,那么我建议您停止查询并重新打开SQL管理器并再试一次。它应该运作良好!!

答案 2 :(得分:0)

我找到了解决方案。

即使我的 BEGIN DIALOG中指定的目标服务包含在同一个数据库中,我也需要明确关于目标的事实strong>服务在同一个数据库中。

这是通过在指定目标服务时添加可选的 CURRENT DATABASE 来完成的:

BEGIN DIALOG @dlg_handle 
FROM SERVICE CheckpointAndLogInitiatorService 
TO
SERVICE 'CheckpointAndLogTargetService', 'CURRENT DATABASE'
ON CONTRACT
CheckpointStart_CheckpointStartReply
WITH ENCRYPTION = OFF;