现在的位置: 首页 > 综合 > 正文

把一个用sql server 2005内置加密方法加密数据的DB从一台电脑备份后,还原到另外一台电脑上,出现的问题的处理办法

2013年08月21日 ⁄ 综合 ⁄ 共 1673字 ⁄ 字号 评论关闭

这篇文章要解决的问题是:

把一个用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还原来目的数据库,执行程序, 会出现下图的错误

a

直接入行存储过程也出同样的错误,如下图

 b

3.       上边的密码1234这里就要用到了,执行如下语句

OPEN MASTER KEY DECRYPTION BY PASSWORD = '1234'

ALTER MASTER KEY REGENERATE WITH ENCRYPTION BY PASSWORD = '1234'

 

 c

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.        

抱歉!评论已关闭.