Проблемы
Предположим, что вы регулярно включаете и выключаете шифрование в базе данных, а также регулярно изменяете ключи шифрования в базе данных SQL Server 2012. В этом случае база данных может не шифроваться при включении шифрования. Если вы измените ключи шифрования, может возникнуть утверждение.
Причина
Эта проблема возникает из-за того, что если ключ шифрования базы данных (DEK) не находится в зашифрованном состоянии, а ключ изменился, то при следующем обновлении ключа копируется ключевая часть DEK, но параметр ENCRYPTION State не копируется должным образом. В SQL Server 2012 после проверки расшифровки DEK в заголовке управляющего блока файлов (FCB) и DEK удаляются только при удалении ключа. При выключенном параметре "шифрование" есть ключевое изменение, а затем вы пытаетесь включить шифрование, так как динамическое административное представление (DMV) показывает, что шифрование завершено. Однако проверка шифрования не выполняется, а страницы остались незашифрованными.
Решение
Сведения о накопительном пакете обновления
SQL Server 2012
Исправление для этой проблемы впервые выпущено в накопительном обновлении 1. Для получения дополнительных сведений о том, как получить этот накопительный пакет обновления для SQL Server 2012, щелкните следующий номер статьи базы знаний Майкрософт:
2679368 Накопительный пакет обновления 1 (SP1) для SQL Server 2012Примечание. Так как сборки являются кумулятивными, каждый новый выпуск исправлений содержит все исправления и все исправления безопасности, которые были включены в предыдущий выпуск исправлений для SQL Server 2012. Рекомендуется установить последнюю версию исправления, которая включает это исправление. Дополнительные сведения см. в следующей статье базы знаний Майкрософт:
2692828 Сборки SQL Server 2012, выпущенные после выпуска SQL Server 2012
Статус
Корпорация Майкрософт подтверждает наличие этой проблемы в своих продуктах, которые перечислены в разделе "Применяется к".
Обходное решение
Для устранения этой проблемы удалите ключ шифрования каждый раз, когда вы отключите шифрование для базы данных.
Дополнительная информация
Сведения о стеке вызовов
FCB::InitializeReencryptionScan ntdbms\storeng\dfs\manager\fcb.cpp 8407FCB::ReencryptFile ntdbms\storeng\dfs\manager\fcb.cpp 8934AsynchronousDiskAction::DoReencryptFile ntdbms\storeng\dfs\manager\asyncdp.cpp 810AsynchronousDiskAction::ExecuteDeferredAction ntdbms\storeng\dfs\manager\asyncdp.cpp 1203AsynchronousDiskPool::ProcessActions ntdbms\storeng\dfs\manager\asyncdp.cpp 2252AsynchronousDiskWorker::ThreadRoutine ntdbms\storeng\dfs\manager\asyncdp.cpp 3120SubprocEntrypoint ntdbms\storeng\dfs\process\subproc.cpp 444SOS_Task::Param::Execute e:\sql11_main_t\sql\common\dk\sos\include\sos.inl 8564SOS_Scheduler::RunTask e:\sql11_main_t\sql\common\dk\sos\src\scheduler.cpp 976SOS_Scheduler::ProcessTasks e:\sql11_main_t\sql\common\dk\sos\src\scheduler.cpp 852SchedulerManager::WorkerEntryPoint e:\sql11_main_t\sql\common\dk\sos\src\node.cpp 1809SystemThread::RunWorker e:\sql11_main_t\sql\common\dk\sos\include\worker.inl 823SystemThreadDispatcher::ProcessWorker e:\sql11_main_t\sql\common\dk\sos\src\node.cpp 449Assert in FCB::InitializeReencryptionScan in file fcb.cpp @ 8407Expression: a_dbDEK->GetDbeState () == CSECDEK::x_dbe_DecryptionInProgress || a_dbDEK->GetDbeState () == CSECDEK::x_dbe_EncryptionInProgress