Sql-Server
使用 SQLCMD 解密主密鑰效果很好,但不是在腳本中
我想使用一個腳本來自動化另一個實例中 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;';