【问题标题】:SSDT skips NOCHECK constraint in compares and publishesSSDT 在比较和发布中跳过 NOCHECK 约束
【发布时间】:2018-05-12 22:33:36
【问题描述】:

由于某种原因,当使用 SSDT 比较或修改表外键时,软件不会更改外键上设置的 NOCHECK 约束。

这是表外键的脚本设置:

表格:

ALTER TABLE [dbo].[SurveyQuestion]  WITH NOCHECK ADD  CONSTRAINT [FK_SurveyQuestion_Language] FOREIGN KEY([LanguageID])
REFERENCES [dbo].[Language] ([ID])
GO

ALTER TABLE [dbo].[SurveyQuestion] CHECK CONSTRAINT [FK_SurveyQuestion_Language]

数据库架构:

CONSTRAINT [FK_SurveyQuestion_Language] FOREIGN KEY ([LanguageID]) REFERENCES [dbo].[Language] ([ID])

所以,这些是不同的设置,但 SSDT 完全忽略了它们。比较回来显示两者是相同的。

在我的发布配置文件中,我未选中“不检查检查约束时忽略” 我也未选中“忽略外键而不检查外键”。所以他们都应该被评估。

任何人都可以在自己的表格中尝试一下吗?只需将数据库中的 CHECK 更改为 NOCHECK 并在其上运行 SSDT 以查看 SSDT 是否修复了差异。

我已经尝试过,SSDT 一直在绕过差异。

谢谢

【问题讨论】:

    标签: sql sql-server sql-server-data-tools dac


    【解决方案1】:

    这两个设置之间的唯一区别是表中的现有数据是否已经被检查过。在这两种情况下,约束都存在并且启用了检查——因此架构是相同的——尽管数据的一致性可能不是,因为在第一个示例中,预先存在的数据可能违反了约束。

    【讨论】:

    • 不,实际上它在数据库表标记中表示 WITH NOCHECK。在您设置了 ssdt 的数据库表中自行尝试。将 db 表列键设置为 WITH NOCHECK 并查看 SSDT 是否在发布时回滚。我在许多数据库中多次尝试过这个。您更改 db 表列中的设置并运行 SSDT 发布,但 SSDT 完全忽略了差异。试试看。
    • 语句的第二部分,ALTER TABLE [dbo].[SurveyQuestion] CHECK CONSTRAINT [FK_SurveyQuestion_Language] 重新打开 CHECK,无论您是创建约束 WITH CHECK 还是 WITH NOCHECK
    • 是的,我明白你在说什么,这是一个事件的指标,数据多于模式。我的观点是,如果我更改设置,SSDT 应该将项目模式同步到数据库表模式,但事实并非如此。 SSDT 说这两个表是相同的,但它们不是。这是一个缺陷。
    • 我也在 RedGate 模式比较中运行了相同的比较,RedGate 报告了预期的差异。这在数据库表中唯一的区别就是NOCHECK。微软说它们是一样的,但 Redgate 说不一样。这似乎是 Microsoft 的缺陷,或者我错过了某个设置。
    猜你喜欢
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    • 2016-10-17
    • 2017-05-07
    • 1970-01-01
    • 1970-01-01
    • 2013-12-27
    • 2012-11-19
    相关资源
    最近更新 更多