這篇文章要解決的問題是:
把一個用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.