sql server语言 - sys.dm_database_encryption_keys 中的加密状态与 sys.dat



如果我查询sys.dm_database_encryption_keys,它会返回3(加密)encryption_statepercent_complete 0。 如果我查询sys.databasesis_encrypted列的值为 0(未加密)。 这两个人似乎对我不利。

数据库是否加密? sys.dm_database_encryption_keys是这么说的,但is_encrypted sys.databases不同意。

在"数据库属性"下,属性Encryption Enabled为 false。

我很困惑。

似乎您遇到了这样一种情况,即 SQL 服务器会自动加密数据库,例如在启用透明数据加密 (TDE) 后,在 tempdb 的情况下。我在带有tempdb的SQL Server 2012测试实例中看到完全相同的情况。MSDN:如果使用 TDE 加密 SQL Server 实例上的任何其他数据库,则将加密 tempdb 系统数据库。

我相信 is_encrypted = 0 反映了数据库是自动加密的事实,而不是通过发出 ALTER 命令。以下是 MSDN 对此参数的说明: 指示数据库是否已加密(反映上次使用 ALTER DATABASE SET ENCRYPTION 子句设置的状态)。

当没有正在进行的加密时,预期 percent_complete = 0。来自 MSDN:数据库加密状态更改的完成百分比。如果没有状态更改,则为 0。

encryption_state = 3 似乎是回答问题的最终提示。MSDN:指示数据库是否已加密,3 = 已加密。

MSDN TDE 页面本身建议使用sys.dm_database_encryption_keys来验证数据库是否已加密。

最后,这里有一个非常方便的脚本来自John Magnabosco的帖子,显示了哪些数据库是用TDE加密的,哪些不是(encryption_state = 3是出纳员):

SELECT
    db.name,
    db.is_encrypted,
    dm.encryption_state,
    dm.percent_complete,
    dm.key_algorithm,
    dm.key_length
FROM
    sys.databases db
    LEFT OUTER JOIN sys.dm_database_encryption_keys dm
        ON db.database_id = dm.database_id;
GO

希望这能让它现在不那么混乱。

最新更新