2013-02-14 21 views
0

我试图研究一个问题,我正在运行读取意图辅助副本在我的sql2012可用性组中,并且似乎无法找到任何东西,但我确实看到了一些有关实例级TDE,但不适用于数据库级证书。sql2012可用性组只读副本和数据库证书使用问题

概述,我有一个包含加密列的表的数据库,该列使用数据库证书进行加密/解密。可用性组的设置以及创建数据库和复制副本似乎都很顺利(三个独立的节点)。但是,当我尝试通过具有读取意向连接的侦听器连接到第二个节点的只读辅助副本时,并使用加密列查询此表时,返回的数据全为NULL。如果我先用密码打开主密钥,然后发出查询,我有正常返回解密的数据,但只持续该会话连接。我应该提到除此之外的其他一切加密主要和辅助副本的问题都可以正常工作。如果我用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 

谢谢大家!

回答

0

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

由于数据库主密钥是使用主数据库的服务主密钥加密的,我必须恢复强制将主服务器的服务主密钥备份到所有辅助服务器,以便不必显式“打开”数据库主密钥在每届会议上。因此,不仅主密钥需要去,而且服务主密钥也是如此,为了保持加密层次相同,只读路由才能正常工作。以下是代码。

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

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 

感谢