You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 08:47:21