sys.dm_database_encryption_keys中的加密状态与sys.databases不一致

时间:2013-01-30 20:23:29

标签: sql-server tde

如果我查询sys.dm_database_encryption_keys,则会返回encryption_state 3(已加密),percent_complete 0。如果我查询sys.databases,则is_encrypted列的值为0(未加密)。这两个似乎与我相反。

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

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

我很困惑。

1 个答案:

答案 0 :(得分:14)

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

is_encrypted = 0 我认为反映了DB是自动加密的事实,而不是通过发出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's post的非常方便的脚本,显示哪些DB使用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

希望这会使它现在不那么混乱。