我有一个场景,我正在将数据库从一台服务器恢复到另一台服务器。在源服务器上,数据库主密钥 (DMK) 使用密码和服务主密钥 (SMK) 进行加密。当我去将它恢复到新服务器时,里面的行sys.key_encryptions
仍然说它是由 SMK 加密的。但事实并非如此,因为两台服务器之间的 SMK 不匹配。是否有任何编程方式来验证 DMK 确实使用此服务器的SMK 加密?
我有一个场景,我正在将数据库从一台服务器恢复到另一台服务器。在源服务器上,数据库主密钥 (DMK) 使用密码和服务主密钥 (SMK) 进行加密。当我去将它恢复到新服务器时,里面的行sys.key_encryptions
仍然说它是由 SMK 加密的。但事实并非如此,因为两台服务器之间的 SMK 不匹配。是否有任何编程方式来验证 DMK 确实使用此服务器的SMK 加密?
为了以编程方式确定当前 SMK 是否用于保护 DMK,您应该能够简单地尝试需要 DMK 的操作。这样的操作需要首先解密 DMK 才能使用它。假设您没有明确打开 DMK(使用创建时提供的密码),解密 DMK 将需要 SMK。如果当前的 SMK 不是正确的SMK,则 DMK 不会被自动解密,操作会失败。所以:
如果您有一个保证存在于正在恢复的数据库中的证书,请尝试使用它:
那应该返回一个非
NULL
VARBINARY 值。如果返回值为NULL
,则需要重新生成 DMK(按照以下说明)。如果不能保证正在恢复的数据库中存在证书,则尝试创建一个。如果 SMK 可用于自动解密 DMK,则将创建证书,否则操作将失败:
但是,由于您刚刚恢复了来自另一个实例的数据库并且没有将该其他实例的 SMK 恢复到新实例中,因此可以安全地假设答案是:“不,DMK没有使用此服务器的 SMK加密。”
这是一种预期的情况,需要采取以下步骤进行补救:
状态的 MSDN 页面
CREATE MASTER KEY
(已添加重点):状态的 MSDN 页面
OPEN MASTER KEY
:ALTER MASTER KEY的 MSDN 页面指出: