Sql-Server

使用 SQLCMD 解密主密鑰效果很好,但不是在腳本中

  • July 14, 2017

我想使用一個腳本來自動化另一個實例中 Db 的遷移過程。數據庫已加密,因此在還原後我需要對其進行解密並使用新的服務密鑰再次加密。

恢復後從 SQLCMD 行很容易 (SQLCMD -S.\myinstance )

USE [MyDatabase];
GO
OPEN MASTER KEY DECRYPTION BY PASSWORD = '...';
ALTER MASTER KEY ADD ENCRYPTION BY SERVICE MASTER KEY;
GO

一切都完美無瑕

相反,如果我把它放在一個腳本中(我想將密碼和數據庫名儲存在變數中)並執行它,我會收到錯誤消息

找不到對稱密鑰“主密鑰”,因為它不存在或您沒有權限。

當然我在同一個使用者中執行腳本(SQL -S.\myistance -i script.sql)

declare @dbMKey nvarchar(100);
DECLARE @exec_sql nvarchar(max);

   SET @exec_sql = 'OPEN MASTER KEY DECRYPTION BY PASSWORD = N' + quotename(@dbMKey,'''') + '; ALTER MASTER KEY ADD ENCRYPTION BY SERVICE MASTER KEY; CLOSE MASTER KEY;';  
   print @exec_sql;
   EXEC sp_executesql @exec_sql

我添加了一個 print 用於調試目的,以確保 sql 命令與我手動編寫的完全相同。

有人有什麼想法嗎?

正如@JohnEisbrener 讓我在評論中註意到的那樣,問題是由於腳本缺少 USE

$$ mydatabase $$陳述。 所以寫儲存過程變數的正確方法是

SET @exec_sql = 'USE MYDATABASE; OPEN MASTER KEY DECRYPTION BY PASSWORD = N' + quotename(@dbMKey,'''') + '; ALTER MASTER KEY ADD ENCRYPTION BY SERVICE MASTER KEY; CLOSE MASTER KEY;'; 

引用自:https://dba.stackexchange.com/questions/179733