我在 Visual Studio 2017 中有一个 SQL 项目,我正在使用 SSDT 从 SQL 数据库更新我的项目,如下所示:
通常,我用作源的数据库正在发生变化(通常以小且不相关的方式),当发生这种情况时,我无法更新我的项目,我得到“commonly https://stackoverflow.com/questions/14774749/sql-schema-compare-will-not-update-after-clr-object-installed-source-schema-dri" "有经验的 https://social.msdn.microsoft.com/Forums/sqlserver/en-US/5c22a7b4-7a82-4717-a118-2475bc62705b/schema-compareupdate-error-target-schema-drift-detected?forum=ssdt":
检测到源架构漂移。按比较刷新。
然而,就我而言,这个错误是合法的,我只是不在乎,无论如何我想更新我的目标。有没有办法忽略此消息并让 Visual Studio 更新我的项目,而不管架构漂移如何?
尽管微软声称这个问题早在 2020 年 5 月就已在 Visual Studio 2019, 16.6 中修复 https://developercommunity.visualstudio.com/t/vs-tools-sql-schema-compare-reports-false-drift-de/840302,我今天能够在我的计算机上一致地重现该问题 - 因此,在我能够可靠地重现“检测到源架构漂移”之后,我对 Visual Studio 2019 的 SSDT 文件(是的,对于未混淆的程序集)进行了一些挖掘。按“比较”刷新。 ”消息,我相信我发现了问题:
-
中止比较的决定是由Microsoft.Data.Tools.Schema.Utilities.Sql.SchemaCompare.SchemaCompareController::VerifyParticipantsNotDrifted()
- The
SchemaCompareController
class is in this assembly:
Common7\IDE\Extensions\Microsoft\SQLDB\DAC\150\Microsoft.Data.Tools.Schema.Sql.dll
- 该方法返回一个
bool
如果在调用该方法时认为源或目标发生“漂移”,则返回值。
-
它通过调用来确定这一点ISchemaCompareParticipant::IsStale()
在两个Source
and Target
对象。
- 就我而言,我的
Source
was my *.sqlproj
项目。所以 SSDT 认为我的项目“过时” - 但为什么呢?
-
经过更多挖掘,我发现 SSDT 使用相同的逻辑进行比较*.sqlproj
就像它一样*.dacpac
files.
- 这是有道理的:当您进行架构比较时,它实际上会构建您的
*.sqlproj
to a *.dacpac
文件在你的MyProject\bin\Debug
and MyProject\bin\Release
目录。
- And the logic for determining if a
.dacpac
file is "stale" is to check 2 things:
- If the Schema Comparison Configuration has changed
- If the
.dacpac
file itself has an old Build Date - or if the .dacpac
doesn't exist at all.
- 这个逻辑在
SchemaCompareParticipantForDacpac.BuildArtifactStale()
-
The BuildArtifactStale()
方法只是抓取.dacpac
's FileInfo.CreationTimeUtc
, LastWriteTimeUtc
, and Length
属性并将其与模式比较启动时拍摄的同一文件属性的快照进行比较。
-
So 某物正在修改bin\Debug\MyProject.dacpac
比较开始和执行生成脚本(或更新目标)步骤之间的文件 - 或者无法生成最新的.dacpac
output.
-
我承认我无法找出什么thing导致我的bin\Debug\MyProject.dacpac
文件无法正确重建,但我确实看到了一些新的构建警告(来自静态分析)。解决这些构建警告并删除后bin\Debug\MyProject.dacpac
and bin\Release\MyProject.dacpac
文件,然后重新运行架构比较,架构漂移错误不再出现。
我的预感是 SSDT 的静态分析过程会干扰 dacpac 构建过程或以其他方式使构建无效,从而阻止最终的结果.dacpac
文件无法生成,即使它构建得很好。
在恢复我的更改以恢复静态分析警告后,我无法重现该问题(啊!),所以我猜测这是构建过程或静态分析部分中的竞争条件。
TL;DR:
执行以下 3 件事(您不需要重新启动 Visual Studio 或重新加载 SSDT 项目)
- 确保您没有任何构建错误或警告,尤其是 SSDT 静态分析工具中的任何内容。
- 删除你的
bin\Debug\YourProject.dacpac
and bin\Release\YourProject.dapac
files.
- Do a project rebuild (both Debug and Release) and check the Last-Modified timestamp on the
.dacpac
file is unchanged between the comparison completing and you clicking Generate Scripts or Publish.
- 如果您确实看到上次修改时间发生变化,请查看是否可以找出导致该变化的原因,并在此 QA 中告知我们,以便我们可以向 MS 提供可靠的错误报告。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)