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

时间:2013-02-14 19:04:22

标签: sql-server-2012

我试图研究我在sql2012可用性组中使用读取意图辅助副本运行的问题,但似乎找不到任何东西,我确实看到了一些关于实例级TDE而不是数据库级证书的事情。

概述,我有一个数据库,其中包含一个加密列的表,该列使用数据库证书进行加密/解密。可用性组的设置以及创建数据库和副本似乎都很顺利(三个单独的节点)。但是,当我尝试通过Listener连接到第二个节点的只读辅助副本的读取意图连接,并使用加密列查询此表时,返回的数据全为NULL。如果我首先使用密码打开主密钥,然后发出查询,我将正常解密的数据解密,但只持续该会话连接。我应该提一下,除了这个主要和辅助副本的加密问题之外的其他一切工作正常。如果我使用readWrite查询主数据库,数据检索就可以了。如果您有关于此设置的其他信息,请与我们联系。

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

open master key命令:

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

全部谢谢!

1 个答案:

答案 0 :(得分:0)

在完成整个过程后,我找到了解决方案并将其发布在此处,以防其他人遇到同样的事情。

由于使用主数据库的服务主密钥对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

由于