徵狀
假設您定期開啟和關閉資料庫加密,也會定期在 SQL Server 2012 中變更資料庫上的加密金鑰。 在這種情況下,當您開啟加密時,資料庫可能不會加密。 如果您變更加密金鑰,可能會發生斷言。
原因
發生這個問題的原因是,如果資料庫加密金鑰(DEK)未處於加密狀態,且變更了金鑰,下次更新金鑰時會複製 DEK 的金鑰部分,但不會正確地複製設定加密狀態。 在 SQL Server 2012 的解密掃描之後,會保留檔案控制區塊(FCB)標頭中的 DEK,而且只會在刪除金鑰時移除 DEK。 當加密關閉時,會有一個金鑰變更,接著您嘗試開啟加密,動態管理檢視(DMV)顯示已完成加密。 不過,不會執行加密掃描,也不會對頁面進行加密。
解決方案
累積更新資訊
SQL Server 2012
此問題的修正程式是在累積更新1中第一次發行。如需如何取得此 SQL Server 2012 累積更新套件的詳細資訊,請按一下下列文章編號,以查看 Microsoft 知識庫中的文章:
2679368 SQL Server 2012 的累積更新套件1注意: 因為組建是累加的,所以每個新的修正程式版本都包含先前 SQL Server 2012 修正版本中所包含的所有修復程式及所有安全性修正程式。 我們建議您考慮套用包含此熱修復程式的最新修正版本。 如需詳細資訊,請按一下下面的文章編號,檢視「Microsoft 知識庫」中的文章:
2692828 在發行 SQL Server 2012 之後發行的 SQL Server 2012 組建
狀態
Microsoft 已確認本篇文章<適用於>一節所列之 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