我试图研究我在我的 sql2012 可用性组中使用读取意图辅助副本遇到的问题,但似乎找不到任何东西,我确实看到了一些关于实例级 TDE 的事情,但没有看到数据库级证书。
概述,我有一个数据库,它有一个带有加密列的表,该列使用数据库证书进行加密/解密。可用性组的设置以及创建数据库和副本似乎都进展顺利(三个独立的节点)。但是,当我尝试通过具有读取意图连接的侦听器连接到第二个节点的只读辅助副本,并使用加密列查询此表时,返回的数据全部为 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
谢谢大家!