Состояние шифрования в 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
Надеюсь, теперь это делает его менее запутанным.