我在Visual Studio 2017中有一个SQL项目,我正在使用SSDT从SQL数据库更新我的项目,如下所示:
通常我使用的数据库作为我的来源正在发生变化(通常是以小而不相关的方式),当发生这种情况时我无法更新我的项目,我得到了“commonly”“experienced” :
检测到源架构偏差。按比较刷新。
但是在我的情况下这个错误是合法的,我只是不在乎,我想反正更新我的目标。有没有办法忽略此消息并让Visual Studio更新我的项目而不管模式漂移?
答案 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
构建到您的 *.dacpac
和 MyProject\bin\Debug
目录中的 MyProject\bin\Release
文件中。.dacpac
文件是否“过时”的逻辑是检查两件事:
.dacpac
文件本身具有旧的构建日期 - 或者 .dacpac
根本不存在。
SchemaCompareParticipantForDacpac.BuildArtifactStale()
BuildArtifactStale()
方法只是获取 .dacpac
的 FileInfo.CreationTimeUtc
、LastWriteTimeUtc
和 Length
属性并将它们与模式比较开始时采用的相同文件的属性。
所以 something 正在比较开始和执行生成脚本(或更新目标)步骤之间修改 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 之间没有变化。