Sql server 2012 sql2012可用性组只读副本和数据库证书使用问题

Sql server 2012 sql2012可用性组只读副本和数据库证书使用问题,sql-server-2012,Sql Server 2012,我试图研究sql2012可用性组中的读取意图辅助副本遇到的问题,但似乎还没有找到任何东西,我确实看到了一些关于实例级TDE的内容,但没有看到数据库级证书 概述,我有一个数据库,它有一个带有加密列的表,该列使用数据库证书进行加密/解密。可用性组的设置以及数据库和副本的创建似乎都进展顺利(三个单独的节点)。但是,当我尝试通过侦听器以读意图连接连接到第二个节点的只读辅助副本,并使用加密列查询此表时,返回的数据都是空的。如果我先用密码打开主密钥,然后发出查询,则返回的数据将按正常方式解密,但仅在该会话连

我试图研究sql2012可用性组中的读取意图辅助副本遇到的问题,但似乎还没有找到任何东西,我确实看到了一些关于实例级TDE的内容,但没有看到数据库级证书

概述,我有一个数据库,它有一个带有加密列的表,该列使用数据库证书进行加密/解密。可用性组的设置以及数据库和副本的创建似乎都进展顺利(三个单独的节点)。但是,当我尝试通过侦听器以读意图连接连接到第二个节点的只读辅助副本,并使用加密列查询此表时,返回的数据都是空的。如果我先用密码打开主密钥,然后发出查询,则返回的数据将按正常方式解密,但仅在该会话连接中有效。我应该提到的是,除了主副本和辅助副本的加密问题之外,其他一切都可以正常工作。如果我用readWrite查询主数据库,数据检索就会很好。请让我知道,如果有其他信息,你想知道这个设置

是否有人知道,如果现在以只读复制副本的读取意图进行查询,那么每个会话连接都必须首先打开主密钥? 或者我设置了一些不正确的东西,我能做些什么来解决这个问题

打开主密钥命令:

OPEN MASTER KEY DECRYPTION BY PASSWORD = 'password';
用于查看加密列的查询:

SELECT CAST(DECRYPTBYCERT(CERT_ID('CertName'), ColName) AS VARCHAR(200)) aliasColName
  FROM [DBName].[dbo].[tableName]
以下是用于在主服务器上创建证书的sql:

USE DBName
DROP CERTIFICATE CertName;
GO

USE DBName
IF NOT EXISTS (SELECT * FROM sys.symmetric_keys 
WHERE [name] LIKE '%DatabaseMasterKey%')
BEGIN
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'password'
END
GO 

USE DBName
OPEN MASTER KEY DECRYPTION BY PASSWORD = 'password'
ALTER MASTER KEY ADD ENCRYPTION BY SERVICE MASTER KEY
GO

USE DBName
CREATE CERTIFICATE CertName FROM FILE = 'C:\Cert.cer'
  WITH PRIVATE KEY ( FILE = 'C:\CertKey.pvk' , 
  DECRYPTION BY PASSWORD = 'password' );
GO

CLOSE MASTER KEY
GO

谢谢大家

经过这个过程后,我找到了解决方案,并将它发布在这里,以防其他人遇到同样的问题

由于DB主密钥是使用主数据库的服务主密钥加密的,因此我必须将主服务器的服务主密钥备份到所有辅助服务器,以便不必在每个会话中显式“打开”DB主密钥。因此,不仅需要使用主密钥,还需要使用服务主密钥,以保持加密层次结构相同,从而使只读路由正常工作。下面是代码

首先从主服务器备份服务主密钥,并将其复制到所有辅助服务器

BACKUP SERVICE MASTER KEY TO FILE = 'C:\service_master_key' 
  ENCRYPTION BY PASSWORD = 'password';
然后使用FORCE选项将其恢复到所有辅助服务器

RESTORE SERVICE MASTER KEY FROM FILE = 'C:\service_master_key' 
  DECRYPTION BY PASSWORD = 'password' FORCE

谢谢

在完成整个过程后,我找到了解决方案,并将在这里发布,以防其他人遇到同样的问题

由于DB主密钥是使用主数据库的服务主密钥加密的,因此我必须将主服务器的服务主密钥备份到所有辅助服务器,以便不必在每个会话中显式“打开”DB主密钥。因此,不仅需要使用主密钥,还需要使用服务主密钥,以保持加密层次结构相同,从而使只读路由正常工作。下面是代码

首先从主服务器备份服务主密钥,并将其复制到所有辅助服务器

BACKUP SERVICE MASTER KEY TO FILE = 'C:\service_master_key' 
  ENCRYPTION BY PASSWORD = 'password';
然后使用FORCE选项将其恢复到所有辅助服务器

RESTORE SERVICE MASTER KEY FROM FILE = 'C:\service_master_key' 
  DECRYPTION BY PASSWORD = 'password' FORCE
谢谢