2010-12-08 70 views
4

我已阅读过各种MSDN页面和SQL Server博客,通常需要在Service Broker数据库中使用主密钥。Service Broker的主密钥要求

事实上,试图接收邮件时,我得到了以下应用程序事件日志消息:

服务代理需要访问 主密钥数据库 “MDR_REPLICATION_Z”。错误代码:26。 必须存在主密钥,并且需要 服务主密钥加密为 。

让我感到困惑的是,为什么在所有对话都加密= OFF时发生这种情况。

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

回答

0

我找到了解决方案。

即使在我BEGIN对话框中指定的目标服务包含在同一个数据库中,我需要的是明确有关的事实,目标服务是同一个数据库中。

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

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

Service Broker Dialog Security

的Service Broker对话安全让 应用程序中使用的身份验证,授权 或加密的 个别谈话对话(或 对话)。默认情况下,所有对话 会话使用对话安全。 当您开始对话时,您可以通过在 BEGIN DIALOG CONVERSATION语句中包含 ENCRYPTION = OFF子句,明确允许对话框继续执行 而无对话安全性。 但是,如果对话目标服务存在远程服务绑定 ,则对话框即使在ENCRYPTION = OFF时也使用 安全性。

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

+0

不存在远程服务绑定,所以这并不能解释它。 – Emmanuel 2010-12-09 11:00:23

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栏会有这样做的原因。

如果经纪人没有发挥作用,我会用下面的查询

USE [master] 
ALTER DATABASE [DATABASE_NAME] SET NEW_BROKER 

然后启用与可信赖设置代理为ON

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

最后,删除主键上创建NEW_BROKER和创建新的主密钥并通过新密码加密:

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

通过单词可以是用户定义的字母数字和符号的混合。

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