SQL Server虚拟机迁移至托管实例后解密返回NULL值求助
虚拟机SQL Server迁移至托管实例后解密返回NULL的排查方案
1. 确认加密密钥链是否完整迁移
托管实例不会自动同步原服务器的加密密钥、证书,先检查目标库的密钥体系:
执行以下查询验证:
-- 检查数据库主密钥状态 SELECT name, is_master_key_encrypted_by_server FROM sys.databases WHERE name = 'Database1'; -- 查看证书列表 SELECT name, pvt_key_encryption_type_desc FROM sys.certificates; -- 查看对称密钥列表 SELECT name, key_algorithm, encryption_type_desc FROM sys.symmetric_keys;
如果发现缺失,从原服务器导出并导入:
- 原服务器导出证书(带私钥):
USE Database1; BACKUP CERTIFICATE [你的证书名] TO FILE = 'C:\备份路径\证书文件.cer' WITH PRIVATE KEY ( FILE = 'C:\备份路径\私钥文件.pvk', ENCRYPTION BY PASSWORD = '强密码' );
- 将文件上传到托管实例可访问的存储(比如Azure Blob,先配置
CREATE CREDENTIAL授权访问),然后导入:
USE Database1; CREATE CERTIFICATE [你的证书名] FROM FILE = '/var/opt/mssql/data/证书文件.cer' WITH PRIVATE KEY ( FILE = '/var/opt/mssql/data/私钥文件.pvk', DECRYPTION BY PASSWORD = '强密码' );
2. 解密前必须显式打开对称密钥
原环境可能会话默认已打开密钥,但托管实例需要手动执行:
USE Database1; -- 打开对称密钥 OPEN SYMMETRIC KEY [你的对称密钥名] DECRYPTION BY CERTIFICATE [你的证书名]; -- 执行解密查询 SELECT CONVERT(nvarchar(100), DecryptByKey([user code])) AS 解密后用户编码 FROM Table1; -- 可选:会话结束会自动关闭,也可手动关闭 CLOSE SYMMETRIC KEY [你的对称密钥名];
3. 修复数据库主密钥的服务器加密状态
如果原数据库主密钥是由服务主密钥加密的,迁移后需要重新绑定托管实例的服务主密钥:
USE Database1; -- 用原主密钥密码打开 OPEN MASTER KEY DECRYPTION BY PASSWORD = '原数据库主密钥密码'; -- 用托管实例的服务主密钥重新加密 ALTER MASTER KEY ADD ENCRYPTION BY SERVICE MASTER KEY; CLOSE MASTER KEY;
4. 检查解密账号的权限
确保执行解密操作的账号拥有以下权限:
USE Database1; GRANT VIEW DEFINITION, CONTROL ON SYMMETRIC KEY::[你的对称密钥名] TO [你的登录账号]; GRANT VIEW DEFINITION ON CERTIFICATE::[你的证书名] TO [你的登录账号];
内容的提问来源于stack exchange,提问作者synccm2012
相关产品推荐
相关产品推荐

