Ознаки
Припустимо, що ви регулярно вмикаєте та вимкнете шифрування в базі даних, а також регулярно змінюйте ключі шифрування в базі даних у SQL Server 2012. У цьому сценарії база даних може бути не шифрується під час увімкнення шифрування. Якщо змінити ключі шифрування, може відбутися твердження.
Причина
Ця проблема виникає через те, що якщо ключ шифрування бази даних (DEK) не перебуває в зашифрованому стані, а ключ буде змінений, то наступне оновлення ключа копіює ключова частина DEK, але не копіює настройку стану шифрування належним чином. У SQL Server 2012, після розшифровки, у заголовку надбудови "Блок керування файлами" (FCB) зберігається відповідний елемент, а DEK буде видалено, лише якщо ключ пропущено. Якщо шифрування вимкнуто, у вас є ключові зміни, а потім ви намагаєтеся ввімкнути шифрування, динамічний режим керування (DMV) показує, що шифрування завершено. Але перевірка шифрування не виконується, і сторінки залишилося не зашифровано.
Спосіб вирішення
Відомості про Сукупне оновлення
SQL Server 2012
Виправлення для цієї проблеми уперше випущено в сукупному оновленні 1. Щоб отримати докладні відомості про отримання цього сукупного оновлення пакета SQL Server 2012, клацніть цей номер статті, щоб переглянути статтю в базі знань Microsoft Knowledge Base:
2679368 Сукупний пакет оновлень пакета 1 для SQL Server 2012Примітка. Оскільки будує сукупну версію, кожен новий випуск Fix містить всі виправлення та виправлення безпеки, які були включені до попередньої версії SQL Server 2012 Fix Release. Радимо застосувати найновішу версію виправлення, що містить це виправлення. Щоб отримати докладні відомості, клацніть номер цієї статті бази знань Microsoft:
2692828 Інстальовано версії SQL Server 2012, випущені після випуску SQL Server 2012
Стан
Корпорація Майкрософт підтвердила, що це проблема в продуктах Microsoft, перелічених у розділі "застосовується до".
Інші способи вирішення
Щоб вирішити цю проблему, залиште ключ шифрування щоразу, коли ви вимкнете шифрування в базі даних.
Додаткові відомості
Відомості про стек викликів
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