我有一个数据库,它从旧的SQL Server 2008R2实例移动到了SQL Server 2012 AlwaysOn集群。数据库中有几个字段使用SQL服务器内置的加密功能进行了加密(主密钥、证书、对称密钥)。
我在我的QA AO实例上运行了以下命令(与旧服务器上运行的相同步骤):
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'password'
CREATE CERTIFICATE myCert
WITH SUBJECT = 'password'
CREATE SYMMETRIC KEY myKeyName
WITH ALGORITHM = TRIPLE_DES
ENCRYPTION BY CERTIFICATE myCert
另外,我还需要运行以下命令才能正确解密数据:
OPEN MASTER KEY DECRYPTION BY PASSWORD = 'password'
ALTER MASTER KEY ADD ENCRYPTION BY SERVICE MASTER KEY
当我运行这个命令时,我随后可以看到所有已解密的数据:OPEN SYMMETRIC KEY myKeyName
DECRYPTION BY CERTIFICATE myCert
select TOP 1000 userid, CONVERT(nVARCHAR(255),DECRYPTBYKEY(password)) from users
CLOSE SYMMETRIC KEY myKeyName
到目前为止都很好。然而,如果我在生产AO集群上运行相同的步骤,则该查询:
select TOP 1000 userid, CONVERT(nVARCHAR(255),DECRYPTBYKEY(password)) from users
返回密码的值为NULL。更让人感到疯狂的是,这个语句(在QA环境中运行)可以很好地解密来自两个数据库的所有内容:
OPEN SYMMETRIC KEY myKeyName
DECRYPTION BY CERTIFICATE myCert
SELECT TOP 1000
userid,
CONVERT(nVARCHAR(255),DECRYPTBYKEY(password))
FROM users
SELECT TOP 1000
userid,
CONVERT(nVARCHAR(255),DECRYPTBYKEY(password))
FROM PRODUCTIONAO.prod_database.dbo.users
CLOSE SYMMETRIC KEY myKeyName
我不确定为什么这在我的QA实例上可以工作,但在我的生产实例上不能。任何帮助将不胜感激!