5

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

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

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

让我感到困惑的是,为什么当我所有的 CONVERSATION 的 ENCRYPTION = OFF 时会发生这种情况。

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

4

3 回答 3

4

Service Broker 对话框安全性

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

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

于 2010-12-08T23:56:03.173 回答
4

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

首先通过右键单击队列并查看传输队列来检查您的服务代理队列,或者简单地使用此查询

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 管理器并重试。它应该运作良好!

于 2013-06-11T11:59:51.470 回答
3

我找到了解决方案。

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

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

BEGIN DIALOG @dlg_handle 
FROM SERVICE CheckpointAndLogInitiatorService 
TO
SERVICE 'CheckpointAndLogTargetService', 'CURRENT DATABASE'
ON CONTRACT
CheckpointStart_CheckpointStartReply
WITH ENCRYPTION = OFF;
于 2010-12-09T14:00:56.633 回答