[英]Ignore “Source schema drift detected” Error, Continue With Update
我解決這個問題的方法是在更新項目之前做一個 SSDT 項目快照,這將被保存為 DACPAC。 更新項目后,我在 SSDT 項目和 DACPAC 文件之間進行架構比較。 這僅選取對項目所做的更改。 然后,我沒有單擊模式比較上的“更新”按鈕(如果目標是 DACPAC,這將不起作用),而是單擊“生成腳本”按鈕。 然后我可以針對目標數據庫運行生成的腳本。
注意:生成的腳本將使用 DACPAC 文件的名稱作為文件開頭的數據庫名稱。 在運行腳本之前將其更改為正確的數據庫名稱。
順便說一句,如果您在進行更改之前忘記拍攝 SSDT 項目的快照(我偶爾會這樣做),只要 SSDT 項目處於源代碼控制中,這不是問題。 只需提交您的更改,然后在獲取項目快照之前檢查您的更改之前的最后一次提交。 然后再次檢查您的最新提交,並在更改后的 SSDT 項目和保存的快照 DACPAC 之間進行架構比較。
盡管微軟聲稱這個問題已在 2020 年 5 月的 Visual Studio 2019 16.6 中得到修復,但我今天能夠在我的計算機上始終如一地重現該問題 - 所以我在我之后對 Visual Studio 2019 的 SSDT 文件進行了一些挖掘(是的,對於未混淆的程序集)能夠可靠地重現“檢測到源架構漂移。按比較刷新。” 消息,我相信我發現了問題:
中止比較的決定由Microsoft.Data.Tools.Schema.Utilities.Sql.SchemaCompare.SchemaCompareController::VerifyParticipantsNotDrifted()
做出
SchemaCompareController
類在這個程序SchemaCompareController
:
Common7\\IDE\\Extensions\\Microsoft\\SQLDB\\DAC\\150\\Microsoft.Data.Tools.Schema.Sql.dll
bool
值。 它通過在Source
和Target
對象上調用ISchemaCompareParticipant::IsStale()
來確定這一點。
Source
是我的*.sqlproj
項目。 所以 SSDT 認為我的項目是“陳舊的”——但為什么呢? 經過更多的挖掘,我看到 SSDT 使用與*.dacpac
文件相同的邏輯來比較*.sqlproj
。
*.sqlproj
您的*.sqlproj
構建為MyProject\\bin\\Debug
和MyProject\\bin\\Release
目錄中的*.dacpac
文件。.dacpac
文件是否“陳舊”的邏輯是檢查兩件事:
.dacpac
文件本身具有舊的構建日期 - 或者.dacpac
根本不存在。
SchemaCompareParticipantForDacpac.BuildArtifactStale()
BuildArtifactStale()
方法只是獲取.dacpac
的FileInfo.CreationTimeUtc
、 LastWriteTimeUtc
和Length
屬性,並將這些屬性與模式比較開始時獲取的相同文件屬性的快照進行比較。
因此,一些被修改bin\\Debug\\MyProject.dacpac
之間的文件比較啟動,當它執行生成的腳本(或更新對象)的步驟-或不產生上最新.dacpac
輸出。
我承認,我是不是能找到什么東西引起了我bin\\Debug\\MyProject.dacpac
文件無法正確重建,但我確實看到了一些新的編譯警告(從靜態分析)。 在解決這些構建警告並刪除bin\\Debug\\MyProject.dacpac
和bin\\Release\\MyProject.dacpac
文件,然后重新運行架構比較后,架構漂移錯誤不再出現。
我的預感是 SSDT 的靜態分析過程會干擾 dacpac 構建過程或以其他方式使構建無效,從而阻止生成最終的.dacpac
文件,即使它構建得很好。
在恢復我的更改以恢復靜態分析警告后,我無法重現該問題(ARGH!)所以我猜測這是構建過程或靜態分析部分中的競爭條件。
做這 3 件事(你應該不需要重新啟動 Visual Studio 或重新加載 SSDT 項目)
bin\\Debug\\YourProject.dacpac
和bin\\Release\\YourProject.dapac
文件。.dacpac
文件上的 Last-Modified 時間戳在比較完成和您單擊 Generate Scripts 或 Publish 之間沒有變化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.