在我的.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
这很烦人,因为它导致报告了许多无用的更改。更令人烦恼的是,我有大约十个具有此类列定义的表,但差异仅报告一个表。
我尝试打开SSMS并右键单击生产数据库中的表和脚本表,创建到新窗口,它在创建脚本中产生以下行:
ALTER TABLE [dbo].[TableName]
ADD DEFAULT ((0)) FOR [State]
所有表都发出相同的结果,但是差异仅在比较中报告一个表。
我该如何解决?我怎么知道为什么这个表是 special ,为什么只报告该表的差异?
答案 0 :(得分:0)
这是已解决的SSDT的一个旧问题-现在,当SSDT从数据库中导入它用来生成差异列表的模型时,删除了括号,并比较了保留的表达式,因此首先下载最新的SSDT。
我已经检查过,问题出在SSDT的12.0版本中,并在14.0中得到了修复,因此该修复程序位于两者之间。
我只需将所有默认设置都设置为(())-要么手动执行,要么将数据库与项目进行比较,这首先会做两件事,这意味着您不会再得到这些烦人的东西事情,其次,它将使比较快一点。
如果存储在SSDT项目中的版本没有两个(和)包装,则表达式SSDT会经历一个附加步骤,即从从数据库中检索的脚本中删除(的)。但是,如果您具有((x)),则SSDT知道数据库也将具有((x)),因此不必删除多余的括号。
所以,1-升级,2-正确放置。
编辑