Sql-Server
由正確服務主密鑰加密的數據庫主密鑰?
我的客戶經常執行我們將數據庫從 prod 環境移動到較低環境的過程(使用 prod 數據庫刷新 QA 等)。這些數據庫上有數據庫主密鑰。我們將這些重新加密到目標伺服器上的服務主密鑰中沒有問題,但這是令人討厭的部分:
- sys.databases 表示 DMK 已經加密(儘管使用源服務的 SMK)
- 我們無法判斷 DMK 是否被目前 SMK 加密(檢查了所有加密 DMV)
- sys.symmetric_keys 中的 SMK 簽名始終為 0x01(在伺服器之間不是唯一的)。
這本身不是問題。修復總是將 DMK 重新加密為 SMK。我們只是想知道它是否已經完成。有人有什麼技巧嗎?
謝謝,埃里克
按照網上的書
“master 中 sys.databases 目錄視圖的 is_master_key_encrypted_by_server 列指示數據庫主密鑰是否被服務主密鑰加密。”
這是連結http://technet.microsoft.com/en-us/library/ms174382.aspx
我們只是想知道它是否已經完成。有人有什麼技巧嗎?
嗯,是的,實際上。
正如我對一個非常相似的問題的以下回答中更充分地解釋的那樣:
由於需要服務主密鑰(正確的)才能將數據庫主密鑰用於未明確指定密碼的操作,因此您只需嘗試使用數據庫主密鑰。如果操作成功,則目前的服務主密鑰是正確的。但是如果它失敗了,那麼你就知道數據庫主密鑰需要一些其他的服務主密鑰。
兩個足夠簡單的選項是:
- 如果您有一個保證存在於正在恢復的數據庫中的證書,請嘗試使用它:
USE [newly_restored_db]; IF ( SIGNBYCERT( CERT_ID( '{certificate_name}' ), 'test' ) IS NULL) BEGIN OPEN MASTER KEY DECRYPTION BY PASSWORD = '{password}'; -- password used to protect DMK ALTER MASTER KEY REGENERATE WITH ENCRYPTION BY PASSWORD = '{password}'; CLOSE MASTER KEY; PRINT 'All fixed, yo!'; END; ELSE BEGIN PRINT 'All good, yo!'; END;
- 如果不能保證正在恢復的數據庫中存在證書,則嘗試創建一個。如果 SMK 可用於自動解密 DMK,則將創建證書,否則操作將失敗:
USE [newly_restored_db]; BEGIN TRY CREATE CERTIFICATE [TestCert] WITH SUBJECT = 'yadda yadda yadda'; DROP CERTIFICATE [TestCert]; PRINT 'All good, yo!'; END TRY BEGIN CATCH OPEN MASTER KEY DECRYPTION BY PASSWORD = '{password}'; -- password used to protect DMK ALTER MASTER KEY REGENERATE WITH ENCRYPTION BY PASSWORD = '{password}'; CLOSE MASTER KEY; PRINT 'All fixed, yo!'; END CATCH;