【问题标题】:Why would SSDT show some minor changes for certain tables only?为什么 SSDT 只显示某些表的一些细微变化?
【发布时间】:2019-01-28 15:05:33
【问题描述】:

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

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

当我针对生产数据库运行项目的 SSDT schema compare 时,会发生以下情况。据报道,与上述类似的一些表格没有差异,而据报道有以下差异。

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

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

但是数据库有这个:

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

这很烦人,因为它会导致报告许多无用的更改。更烦人的是,我有十个表具有这样的列定义,但仅报告一个表的差异。

我尝试打开 SSMS 并右键单击生产数据库中的表和 将表编写为CREATE To new window 它在创建脚本中产生以下行:

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

所有表格都发出相同的内容,但差异仅报告比较中的一个表格。

我该如何解决这个问题?我怎么知道为什么这个表是特殊的,并且只报告这个表的差异?

【问题讨论】:

  • 嗯,这很奇怪。您可以查看sys.default_constraints。默认约束表达式以规范形式解析和存储,这就是添加括号的原因。如果你在脚本中执行DEFAULT 0,它会被存储为((0)),这就是SSMS 报告的内容——但是,在其他情况下,它是如何到达(0) 的还不清楚(你会期望额外的括号总是被剥离),或者为什么比较不会总是考虑到这一点。
  • 您可以尝试使用最新版本的 SSDT 吗?请始终使用最新版本的 SSDT 和 SSMS,以获得最佳的 Azure SQL 数据库体验。

标签: sql visual-studio visual-studio-2015 azure-sql-database sql-server-data-tools


【解决方案1】:

这是 SSDT 的一个老问题,现已修复 - 现在,当 SSDT 从用于生成差异列表的数据库中导入模型时,会删除环绕括号并首先比较剩下的表达式下载最新的 SSDT。

我检查过,问题出在 SSDT 的 12.0 版本中,并在 14.0 中修复,因此修复介于两者之间。

我只会将所有默认值设置为 (( )) - 要么手动设置,要么从数据库与项目进行比较,这将首先做两件事,这意味着你不会得到这些烦人的附加信息事情,其次它会使比较快一点。

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

所以,1 - 升级,2 - 把它们做好。

编辑

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多