【发布时间】:2014-06-19 21:58:38
【问题描述】:
Visual Studio 架构比较和数据库发布工具未检测到定义外键的列顺序的差异。
假设源数据库/数据库项目上存在以下外键约束:
ALTER TABLE dbo.ReferencingTable
ADD CONSTRAINT FK_1
FOREIGN KEY (Column1, Column2)
REFERENCES dbo.ReferencedTable (Column1, Column2)
假设目标数据库/数据库项目完全相同,除了外键 FK_1,列以不同的顺序定义(注意 Column2 现在指向 dbo.ReferencedTable.Column1,Column 1 指向 dbo.ReferencedTable .Column2) 像这样:
ALTER TABLE dbo.ReferencingTable
ADD CONSTRAINT FK_1
FOREIGN KEY (Column2, Column1)
REFERENCES dbo.ReferencedTable (Column1, Column2)
注意:假设列是类型兼容的(例如所有 INT)
我希望 VS 能够检测到这种差异并生成正确的脚本来更新目标架构(即目标外键)。
找不到控制此行为的设置/选项。这是一个错误吗?
【问题讨论】:
-
曾经有一个“忽略列顺序”选项,但在 VS 2012/2013 中已删除。此选项适用于表定义中的列顺序,但我不确定它是否也适用于外键约束。
-
基思,感谢您的回复。是的,我知道这样的选择。它适用于表中的列顺序并有助于避免表重建。在我看来,这个选择是有道理的。但是,考虑到这一点,我不明白为键启用/禁用此行为的选项首先是如何有意义的。键(及其列顺序隐含的列映射)必须按照定义进行解释,这不是一个选项。禁用此行为将违反关系原则。
-
我只是尝试在 SSDT 2012 中切换 FK 关系列的顺序。如果列与父表。所以 Column1,Column2 仅在父表中 PK 列的顺序时才有效。
-
彼得,感谢您的尝试。但是,请注意列名是无关紧要的,只要它们是类型兼容的。如果 Column1 和 Column2 属于同一类型(例如 INT),它肯定会让您根据需要定义 FK。
-
知道了 - 刚刚使用 SSDT 2012 进行了测试并得到了相同的行为。对我来说听起来像是一个错误,因为如果你第一次出错,那么在推送代码时会产生相当大的差异。可以在部署后修复,但很难看,您需要知道存在问题。
标签: sql sql-server visual-studio-2013 database-schema database-project