忽略“检测到源模式漂移”错误,继续更新

时间:2018-04-18 20:53:06

标签: visual-studio visual-studio-2017 sql-server-data-tools schema-compare

我在Visual Studio 2017中有一个SQL项目,我正在使用SSDT从SQL数据库更新我的项目,如下所示:

enter image description here

通常我使用的数据库作为我的来源正在发生变化(通常是以小而不相关的方式),当发生这种情况时我无法更新我的项目,我得到了“commonly”“experienced” :

  

检测到源架构偏差。按比较刷新。

但是在我的情况下这个错误是合法的,我只是不在乎,我想反正更新我的目标。有没有办法忽略此消息并让Visual Studio更新我的项目而不管模式漂移?

2 个答案:

答案 0 :(得分:2)

我解决这个问题的方法是在更新项目之前进行SSDT项目快照,该项目将保存为DACPAC。更新项目后,我在SSDT项目和DACPAC文件之间进行模式比较。这只会获取对项目所做的更改。然后,不是单击架构比较上的“更新”按钮,而是在目标是DACPAC时无效,我单击“生成脚本”按钮。然后,我可以针对目标数据库运行生成的脚本。

注意:生成的脚本将使用DACPAC文件的名称作为文件头部的数据库名称。在运行脚本之前将其更改为正确的数据库名称。

顺便说一句,如果您在进行更改之前忘记拍摄SSDT项目的快照(我偶尔会这样做),只要SSDT项目处于源代码管理中,就不会有问题。只需提交更改,然后在进行项目快照之前检查更改之前的最后一次提交。然后再次检查最新的提交,并在更改的SSDT项目和保存的快照DACPAC之间进行模式比较。

答案 1 :(得分:1)

Despite Microsoft claiming this issue was fixed in Visual Studio 2019, 16.6 back in May 2020,我今天能够在我的计算机上始终如一地重现该问题 - 因此,在我能够可靠地重现“源架构”之后,我对 Visual Studio 2019 的 SSDT 文件进行了一些挖掘检测到漂移。按比较刷新。”消息,我相信我发现了问题:


  • 中止比较的决定是由 Microsoft.Data.Tools.Schema.Utilities.Sql.SchemaCompare.SchemaCompareController::VerifyParticipantsNotDrifted()

    做出的
    • SchemaCompareController 类位于此程序集中:
      • Common7\IDE\Extensions\Microsoft\SQLDB\DAC\150\Microsoft.Data.Tools.Schema.Sql.dll
    • 如果该方法在调用该方法时认为源或目标“漂移”,则该方法返回一个 bool 值。
  • 它通过在 ISchemaCompareParticipant::IsStale()Source 对象上调用 Target 来确定这一点。

    • 就我而言,我的 Source 是我的 *.sqlproj 项目。所以 SSDT 认为我的项目“过时” - 但为什么呢?
  • 经过更多挖掘,我发现 SSDT 使用与比较 *.sqlproj 文件相同的逻辑来比较 *.dacpac

    • 这是有道理的:当您进行架构比较时,它实际上会将您的 *.sqlproj 构建到您的 *.dacpacMyProject\bin\Debug 目录中的 MyProject\bin\Release 文件中。
    • 确定 .dacpac 文件是否“过时”的逻辑是检查两件事:
      1. 如果架构比较配置已更改
        • 在我们的例子中,它绝对没有,所以我们可以消除它。
      2. 如果 .dacpac 文件本身具有旧的构建日期 - 或者 .dacpac 根本不存在。
        • 这个逻辑在SchemaCompareParticipantForDacpac.BuildArtifactStale()
  • BuildArtifactStale() 方法只是获取 .dacpacFileInfo.CreationTimeUtcLastWriteTimeUtcLength 属性并将它们与模式比较开始时采用的相同文件的属性。

  • 所以 something 正在比较开始和执行生成脚本(或更新目标)步骤之间修改 bin\Debug\MyProject.dacpac 文件 - 或者未能生成最新的 .dacpac 输出。

  • 我承认我无法找出是什么事情导致我的 bin\Debug\MyProject.dacpac 文件无法正确重建,但我确实看到了一些新版本警告(来自静态分析)。在解决这些构建警告并删除 bin\Debug\MyProject.dacpacbin\Release\MyProject.dacpac 文件,然后重新运行架构比较后,架构漂移错误不再出现。

我的预感是 SSDT 的静态分析过程会干扰 dacpac 构建过程或以其他方式使构建无效,从而阻止生成最终的 .dacpac 文件,即使它构建正常也是如此。

在恢复我的更改以恢复静态分析警告后,我无法重现问题(ARGH!)所以我猜这是构建过程或静态分析部分的竞争条件。


TL;DR:

做这 3 件事(你应该不需要重启 Visual Studio 或重新加载 SSDT 项目)

  1. 确保您没有任何构建错误或警告,尤其是来自 SSDT 的静态分析工具的错误。
  2. 删除您的 bin\Debug\YourProject.dacpacbin\Release\YourProject.dapac 文件。
  3. 重新构建项目(调试和发布)并检查 .dacpac 文件上的 Last-Modified 时间戳在比较完成和您点击 Generate Scripts 或 Publish 之间没有变化。
    • 如果您确实看到了 Last-Modified 时间更改,请查看您是否能找出原因并在此 QA 中告知我们,以便我们向 MS 提供可靠的错误报告。