代码之家  ›  专栏  ›  技术社区  ›  sharptooth

为什么ssdt只显示某些表的一些小更改?

  •  0
  • sharptooth  · 技术社区  · 7 年前

    在我的.sqlproj项目中,我有许多SQL数据库表,其中的列具有默认约束,例如:

     CREATE TABLE TableName
    (
    -- Some other columns defined too
    [State] TINYINT NOT NULL DEFAULT (0),
    )
    

    当我运行ssdt时 架构比较 针对生产数据库的项目发生以下情况。有些表格,如上面的一个报告没有差异,一个报告有以下差异。

    比较工具说项目有这个(这是真的,对所有其他表也是如此):

    -- Single braces around zero
    [State] TINYINT DEFAULT (0) NOT NULL
    

    但数据库里有:

    -- Double braces around zero
    [State] TINYINT DEFAULT ((0)) NOT NULL
    

    这很烦人,因为它会导致许多无用的更改被报告。更让人恼火的是,我有10个表有这样的列定义,但是只有一个表有差异。

    我试图打开ssms并右键单击生产数据库中的表,然后 编写表脚本为 ,请 创建到新窗口 它在创建脚本中生成以下行:

    ALTER TABLE [dbo].[TableName]
      ADD  DEFAULT ((0)) FOR [State]
    

    所有的表都发射了同样的东西,但是在比较中只有一个表的差异。

    我该如何解决这个问题?我怎么知道这张桌子为什么 特殊的 只为这张桌子报告差异?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Ed Elliott    7 年前

    这是ssdt的一个老问题,已经解决了-现在当ssdt从它用来生成差异列表的数据库中导入模型时,将删除换行括号并比较剩下的表达式,因此首先下载最新的ssdt。

    我已经检查过了,问题出在ssdt的12.0版本中,并在14.0中修复了,所以修复工作介于两者之间。

    我会把你所有的默认值都设置为(……)-要么手动操作,要么从你的数据库中与你的项目进行比较,这将做两件事:第一,这意味着你不会得到这些烦人的额外东西,第二,这将使比较快一点。

    如果存储在ssdt项目中的版本没有两个('s and')包装,则表达式ssdt将执行另一个步骤,从从从数据库检索的脚本中删除 但是 如果您有((x))那么ssdt知道数据库也有((x))所以它不必删除额外的括号。

    所以,1-升级,2-纠正他们。

    预计起飞时间