Состояние шифрования в sys.dm_database_encryption_keys не соответствует sys.databases

Если я сделаю запрос 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 ложно

Я не совсем понимаю.

1 ответ

Решение

Кажется, у вас есть случай, когда БД автоматически шифровалась сервером SQL, например, в случае tempdb, когда было включено прозрачное шифрование данных (TDE). Я вижу точно такой же случай в моем тестовом экземпляре SQL Server 2012 с tempdb. MSDN: системная база данных tempdb будет зашифрована, если любая другая база данных на экземпляре SQL Server будет зашифрована с использованием TDE.

is_encrypted = 0 Я полагаю, отражает тот факт, что БД была зашифрована автоматически, а не с помощью команды ALTER. Вот что MSDN говорит об этом параметре: Указывает, зашифрована ли база данных (отражает последнее состояние, установленное с помощью предложения ALTER DATABASE SET ENCRYPTION).

cent_complete = 0 ожидается, когда нет текущего шифрования. Из MSDN: процент завершения изменения состояния шифрования базы данных. Это будет 0, если нет изменения состояния.

encryption_state = 3 выглядит как окончательная подсказка при ответе на вопрос. MSDN: указывает, зашифрована ли база данных или нет, 3 = зашифровано.

На самой странице MSDN TDE предлагается использовать sys.dm_database_encryption_keys, чтобы проверить, зашифрована ли БД или нет.

И, наконец, вот очень полезный скрипт из поста Джона Магнабоско, показывающий, какие БД зашифрованы с помощью TDE, а какие нет (шифровщик = 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

Надеюсь, теперь это делает его менее запутанным.

Другие вопросы по тегам