簡體   English   中英

忽略“檢測到源架構漂移”錯誤,繼續更新

[英]Ignore “Source schema drift detected” Error, Continue With Update

我在 Visual Studio 2017 中有一個 SQL 項目,我正在使用 SSDT 從 SQL 數據庫更新我的項目,如下所示:

在此處輸入圖片說明

通常,我用作源的數據庫正在更改(通常以微小且不相關的方式),當發生這種情況時,我無法更新我的項目,我得到“ 通常”“ 經驗豐富”:

檢測到源架構漂移。 按比較刷新。

但是,在我的情況下,此錯誤是合法的,我只是不在乎,無論如何我都想更新我的目標。 有沒有辦法忽略此消息並讓 Visual Studio 更新我的項目而不管架構漂移如何?

我解決這個問題的方法是在更新項目之前做一個 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值。
  • 它通過在SourceTarget對象上調用ISchemaCompareParticipant::IsStale()來確定這一點。

    • 就我而言,我的Source是我的*.sqlproj項目。 所以 SSDT 認為我的項目是“陳舊的”——但為什么呢?
  • 經過更多的挖掘,我看到 SSDT 使用與*.dacpac文件相同的邏輯來比較*.sqlproj

    • 這是有道理的:當您進行架構比較時,它實際上*.sqlproj您的*.sqlproj構建為MyProject\\bin\\DebugMyProject\\bin\\Release目錄中的*.dacpac文件。
    • 確定.dacpac文件是否“陳舊”的邏輯是檢查兩件事:
      1. 如果架構比較配置已更改
        • 在我們的例子中,它絕對沒有,所以我們可以消除它。
      2. 如果.dacpac文件本身具有舊的構建日期 - 或者.dacpac根本不存在。
        • 此邏輯在SchemaCompareParticipantForDacpac.BuildArtifactStale()
  • BuildArtifactStale()方法只是獲取.dacpacFileInfo.CreationTimeUtcLastWriteTimeUtcLength屬性,並將這些屬性與模式比較開始時獲取的相同文件屬性的快照進行比較。

  • 因此,一些被修改bin\\Debug\\MyProject.dacpac之間的文件比較啟動,當它執行生成的腳本(或更新對象)的步驟-或不產生上最新.dacpac輸出。

  • 我承認,我是不是能找到什么東西引起了我bin\\Debug\\MyProject.dacpac文件無法正確重建,但我確實看到了一些新的編譯警告(從靜態分析)。 在解決這些構建警告並刪除bin\\Debug\\MyProject.dacpacbin\\Release\\MyProject.dacpac文件,然后重新運行架構比較后,架構漂移錯誤不再出現。

我的預感是 SSDT 的靜態分析過程會干擾 dacpac 構建過程或以其他方式使構建無效,從而阻止生成最終的.dacpac文件,即使它構建得很好。

在恢復我的更改以恢復靜態分析警告后,我無法重現該問題(ARGH!)所以我猜測這是構建過程或靜態分析部分中的競爭條件。


特爾;博士:

做這 3 件事(你應該不需要重新啟動 Visual Studio 或重新加載 SSDT 項目)

  1. 確保您沒有任何 Build Errors或 Warnings ,尤其是 SSDT 的靜態分析工具。
  2. 刪除bin\\Debug\\YourProject.dacpacbin\\Release\\YourProject.dapac文件。
  3. 執行項目重建(調試和發布)並檢查.dacpac文件上的 Last-Modified 時間戳在比較完成和您單擊 Generate Scripts 或 Publish 之間沒有變化。
    • 如果您確實看到了 Last-Modified 時間更改,請查看您是否能找出導致它的原因,並在此 QA 中告訴我們,以便我們可以向 MS 提供可靠的錯誤報告。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM