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 和其他高度特权的服务器主体能够解密数据库。
使用sp_control_dbmasterkey_password创建的凭据在 sys.master_key_passwords 目录视图中可见。 为数据库主密钥创建的凭据的名称具有以下格式: ##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 语句和密码。 若要避免使用密码,请在将数据库移动到只读模式之前创建凭据。
潜在的向后兼容性问题: 目前,存储过程不会检查主密钥是否存在。 这允许向后兼容,但显示警告。 不推荐使用此行为。 在将来的版本中,主密钥必须存在,并且存储过程 中使用的密码sp_control_dbmasterkey_password 必须与用于加密数据库主密钥的密码之一相同。
权限
要求具有 sysadmin 固定服务器角色的成员身份。
示例
A. 为 AdventureWorks 主密钥创建凭据
以下示例为 AdventureWorks2022
数据库主密钥创建凭据,并将主密钥密码保存为凭据中的机密。 由于传递给 sp_control_dbmasterkey_password
的所有参数都必须为数据类型 nvarchar,因此文本字符串使用强制转换运算符 N
进行转换。
EXEC sp_control_dbmasterkey_password @db_name = N'AdventureWorks2022',
@password = N'sdfjlkj#mM00sdfdsf98093258jJlfdk4', @action = N'add';
GO
B. 删除数据库主密钥的凭据
以下示例删除在示例 A 中创建的凭据。请注意,所有参数都是必需的,包括密码。
EXEC sp_control_dbmasterkey_password @db_name = N'AdventureWorks2022',
@password = N'sdfjlkj#mM00sdfdsf98093258jJlfdk4', @action = N'drop';
GO
另请参阅
设置加密的镜像数据库
安全存储过程 (Transact-SQL)
系统存储过程 (Transact-SQL)
sys.credentials (Transact-SQL)
凭据(数据库引擎)
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈