我已阅读各种MSDN页面和SQL Server博客,其中“通常”是Service Broker数据库中需要的主密钥。
的确,在尝试接收消息时,我收到以下应用程序事件日志消息:
Service Broker需要访问 数据库中的主密钥 'MDR_REPLICATION_Z'。错误代码:26。 主密钥必须存在和 服务主密钥加密是 必需的。
让我感到困惑的是,当我所有的CONVERSATION都加密= OFF时,为什么会这样。
有没有办法在ENCYRPTION为OFF的单个数据库内部使用Service Broker,而无需创建数据库主密钥?
答案 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;