sp_control_dbmasterkey_password (Transact-SQL)
加入或卸除認證,其中包含開啟資料庫主要金鑰所需的密碼。
語法
sp_control_dbmasterkey_password @db_name = 'database_name'
, @password = 'master_key_password'
, @action = { 'add' | 'drop' }
引數
@db_name = N'database_name'
指定這個認證的相關資料庫名稱。不能是系統資料庫。database_name 是 nvarchar。@password = N'password'
指定主要金鑰的密碼。password 是 nvarchar。@action = N'add'
指定要將指定資料庫的認證加入至認證存放區中。認證會包含資料庫主要金鑰的密碼。傳遞至 @action 的值是 nvarchar。@action =N'drop'
指定要從認證存放區中卸除指定資料庫的認證。傳遞至 @action 的值是 nvarchar。
備註
當 SQL Server 需要利用資料庫主要金鑰解密或加密金鑰時,SQL Server 會嘗試利用執行個體的服務主要金鑰來解密資料庫主要金鑰。如果解密失敗,SQL Server 會從認證存放區中搜尋主要金鑰憑證,而這是含有與它需要其主要金鑰之資料庫相同家族 GUID 的主要金鑰認證。接著,SQL Server 會嘗試利用每個相符的認證來解密資料庫主要金鑰,直到解密成功或沒有其他認證為止。
注意 |
---|
請勿建立一個不能由 sa 和其他高權限伺服器主體存取之資料庫的主要金鑰認證。您可以將資料庫設為不能由服務主要金鑰解密它的金鑰階層。這個選項可作為特定資料庫的深度防衛,該等資料庫所含加密資訊不應該由 sa 或其他高權限伺服器主體存取。建立這類資料庫的主要金鑰認證會移除這個深度防衛,使 sa 和其他高權限伺服器主體能夠解密資料庫。 |
您可以在 sys.master_key_passwords 目錄檢視中,看到利用 sp_control_dbmasterkey_password 建立的認證。為資料庫主要金鑰建立的認證名稱採用下列格式:##DBMKEY_<database_family_guid>_<random_password_guid>##。密碼會儲存為認證秘密。就加入至認證存放區的每個密碼而言,sys.credentials 中都有資料列。
您無法利用 sp_control_dbmasterkey_password 建立下列系統資料庫的認證:master、model、msdb 或 tempdb。
sp_control_dbmasterkey_password 不確認密碼可以開啟指定資料庫的主要金鑰。
如果您指定的密碼已儲存在指定資料庫的認證中,sp_control_dbmasterkey_password 會失敗。
[!附註]
來自不同伺服器執行個體的兩個資料庫可以共用相同的家族 GUID。如果發生這種情況,這兩個資料庫會共用認證存放區中相同的主要金鑰記錄。
傳遞至 sp_control_dbmasterkey_password 的參數不會出現在追蹤中。
[!附註]
當您使用的認證是之前使用 sp_control_dbmasterkey_password 開啟資料庫主要金鑰所加入的認證時,服務主要金鑰會重新加密資料庫主要金鑰。如果資料庫處於唯讀模式,重新加密作業將會失敗,而且資料庫主要金鑰會維持未加密的狀態。之後如果要存取資料庫主要金鑰,您必須使用 OPEN MASTER KEY 陳述式和密碼。若要避免使用密碼,將資料庫移到唯讀模式之前要先建立認證。
權限
需要資料庫的 CONTROL 權限。
範例
A. 建立 AdventureWorks2008R2 主要金鑰的認證
下列範例會建立 AdventureWorks2008R2 資料庫主要金鑰的認證,並將主要金鑰密碼儲存為認證中的秘密。因為傳遞至 sp_control_dbmasterkey_password 的所有參數都必須屬於資料類型 nvarchar,所以必須利用轉換運算子 N 來轉換字串。
EXEC sp_control_dbmasterkey_password @db_name = N'AdventureWorks2008R2',
@password = N'sdfjlkj#mM00sdfdsf98093258jJlfdk4', @action = N'add';
GO
B. 卸除資料庫主要金鑰的認證
下列範例會移除範例 A 中建立的認證。請注意,所有參數都需要,包括密碼。
EXEC sp_control_dbmasterkey_password @db_name = N'AdventureWorks2008R2',
@password = N'sdfjlkj#mM00sdfdsf98093258jJlfdk4', @action = N'drop';
GO