这篇文章要解决的问题是:
把一个用sql server 2005内置加密方法加密数据的DB从一台电脑备份后,还原到另外一台电脑上,出现的问题的处理办法.
文章中的处理方法可行的前提是:
一个DB用了sql server 2005的加密方法,方法是这样的
CREATE master KEY ENCRYPTION BY PASSWORD = '1234';
CREATE CERTIFICATE Certificate1
WITH SUBJECT = 'description for key',
EXPIRY_DATE = '12/31/2020';
CREATE SYMMETRIC KEY KeyNameTest
WITH ALGORITHM = TRIPLE_DES
ENCRYPTION BY CERTIFICATE Certificate1;
这些语句表示,整个DB的数据用symmetric key来加密,而这个symmetric key又是用Certificate1来加密,Certificate1没有指定密码,所以它默认是用master key来加密的,这里一定经记住master key的密码是1234, 这对后边的步聚很重要.
下边来说一下步聚:
1. 从源DB来,备份出一个文件。
2. 把DB还原来目的数据库,执行程序, 会出现下图的错误
直接入行存储过程也出同样的错误,如下图
3. 上边的密码1234这里就要用到了,执行如下语句
OPEN MASTER KEY DECRYPTION BY PASSWORD = '1234'
ALTER MASTER KEY REGENERATE WITH ENCRYPTION BY PASSWORD = '1234'
4. 执行成功后,就可成界进入界面,或直接执行存储过程
5. 在一个群里有一个朋友提供另一种方法(针对另一种问题
但我试了,发现语句OPEN MASTER KEY DECRYPTION BY SERVICE MASTER KEY都根本不可执行,
--QA:附加数据库时,如果数据库主密钥的密码丢失怎么办?
--当一个数据库被附加到一个新得sql server实例后,它的数据库主密钥(database master key)默认不会被服务器主密钥
--(service master key)保护.在这种情况下,我们需要自己修改这种状态,使它被服务器主密钥保护。
--但如果忘记了数据库主密钥得密码,则无法完成这项操作.
--
--
--如何解决这一问题:
--在原始实例上为db1的数据库添加新的密码,这样我们就可以在新的实例中使用这个密码了.
--
--在原始实例上执行一下代码:
OPEN MASTER KEY DECRYPTION BY SERVICE MASTER KEY
ALTER MASTER KEY ADD ENCRYPTION BY PASSWORD = 'new password'
CLOSE MASTER KEY
--在新实例中:
OPEN MASTER KEY DECRYPTION BY PASSWORD = 'new password'
ALTER MASTER KEY ADD ENCRYPTION BY SERVICE MASTER KEY
CLOSE MASTER KEY
6. 我在网上搜了一下关键字OPEN MASTER KEY DECRYPTION BY SERVICE后,对我的方法改进了一下,因为我的方法有时侯备份还原是不行的,有时侯就可以,网上也有人说过,但我还没详细看过他们的文章,我改进后的方法是可以随时随行的. 代码如下:
(前提还得是要记得原来的master key的密码, 并不像第五点中所说的)
OPEN MASTER KEY DECRYPTION BY PASSWORD = '123456'
ALTER MASTER KEY DROP ENCRYPTION BY SERVICE MASTER KEY
ALTER MASTER KEY ADD ENCRYPTION BY SERVICE MASTER KEY
ALTER MASTER KEY REGENERATE WITH ENCRYPTION BY PASSWORD = '123456'
7.