【问题标题】:Requirement for a Master Key for Service BrokerService Broker 的主密钥要求
【发布时间】:2010-12-08 21:08:17
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: sql-server service-broker


    【解决方案1】:

    来自Service Broker Dialog Security

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

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

    【讨论】:

    • 不存在远程服务绑定,所以这里不解释。
    【解决方案2】:

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

    首先通过右键单击队列并查看传输队列来检查您的服务代理队列 或者干脆使用这个查询

    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
    

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

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

    【讨论】:

      【解决方案3】:

      我找到了解决办法。

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

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

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

      【讨论】:

        猜你喜欢
        • 2010-11-04
        • 2012-01-12
        • 2014-02-13
        • 2012-10-30
        • 1970-01-01
        • 2013-09-21
        • 2017-07-04
        • 1970-01-01
        • 2021-11-24
        相关资源
        最近更新 更多