sp_control_dbmasterkey_password (Transact-SQL)

适用于: SQL Server Azure SQL 托管实例

添加或删除包含打开数据库主密钥(DMK)所需的密码的凭据。

Transact-SQL 语法约定

语法

sp_control_dbmasterkey_password @db_name = 'db_name'
    , @password = 'password'
    , @action = { N'add' | N'drop' }

参数

@db_name= N'db_name'

指定与此凭据关联的数据库的名称。 不能是系统数据库。 @db_name为 nvarchar

@password= N'password'

指定 DMK 的密码。 @passwordnvarchar

@action = { N'add' |N'drop' }

指定凭据存储中指定数据库的凭据的操作。 传递给@action的值为 nvarchar

操作 说明
add 指定已指定数据库的凭据将添加到凭据存储区中。 凭据包含 DMK 的密码。
drop 指定将从凭据存储区中删除已指定数据库的凭据。

注解

当 SQL Server 需要 DMK 来解密或加密密钥时,SQL Server 会尝试使用实例的服务主密钥 (SMK) 解密 DMK。 如果解密失败,SQL Server 会在凭据存储中搜索与需要密钥的数据库具有相同系列 GUID 的凭据。 然后,SQL Server 会尝试使用每个匹配凭据解密 DMK,直到解密成功或不再提供凭据。

注意

不要为必须访问 sa 的数据库和其他高特权服务器主体创建主密钥凭据。 可以配置数据库,以便 SMK 无法解密其密钥层次结构。 对于包含不应访问 sa 的加密信息或其他特权服务器主体的加密信息的数据库,支持此选项是一种深度防御。 为此类数据库创建凭据会消除这种深度防御,从而使 sa 其他高特权服务器主体能够解密数据库。

通过使用 sp_control_dbmasterkey_password 创建的凭据在 sys.master_key_passwords 目录视图中可见。 为 DMK 创建的凭据的名称具有以下格式: ##DBMKEY_<database_family_guid>_<random_password_guid>## 该密码存储为凭据机密。 添加到凭据存储中的每个密码都有 sys.credentials一个匹配的行。

不能用于sp_control_dbmasterkey_password为以下系统数据库创建凭据:mastermodelmsdbtempdb

sp_control_dbmasterkey_password 不验证密码是否可以打开指定数据库的 DMK。

如果指定已存储在指定数据库的凭据中的密码, sp_control_dbmasterkey_password 则失败。

来自不同服务器实例的两个数据库可以共享相同的系列 GUID。 如果发生这种情况,数据库在凭据存储中共享相同的 DMK 记录。

传递给 sp_control_dbmasterkey_password 的参数不会显示在跟踪中。

使用通过打开 sp_control_dbmasterkey_password DMK 添加的凭据时,SMK 会重新加密 DMK。 如果数据库处于只读模式,则重新加密操作会失败,DMK 将保持未加密状态。 若要后续访问 DMK,必须使用 OPEN MASTER KEY 语句和密码。 为避免使用密码,请在将数据库迁移到只读模式前创建凭据。

潜在的后向兼容性问题

目前,存储过程不会检查密钥是否存在。 允许此功能向后兼容,但显示警告。 不推荐使用此行为。 在将来的版本中,密钥必须存在,并且存储过程 sp_control_dbmasterkey_password 中使用的密码必须与用于加密 DMK 的密码之一相同。

权限

需要 sysadmin 固定服务器角色的成员身份,或直接在此存储过程上执行权限。

示例

本文中的 Transact-SQL 代码示例使用 AdventureWorks2022AdventureWorksDW2022 示例数据库,可从 Microsoft SQL Server 示例和社区项目主页下载它。

A. 为 AdventureWorks 主密钥创建凭据

以下示例为 AdventureWorks2022 DMK 创建凭据,并将主密钥密码保存为凭据中的机密。 由于传递给 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