SSMS 突然开始生成内联到 CREATE TABLE 语句而不是 ALTER TABLE 的 DEFAULT 约束

Vla*_*nov 6 sql-server ssms

我一直在使用 SSMS 生成整个数据库的脚本并将它们存储在源代码管理中。

短信

选项

多年来它一直运行良好,但几天前我注意到 SSMS 开始生成DEFAULT约束作为内联到CREATE TABLE语句中的子句,而不是添加单独的ALTER TABLE语句。

这是一张表的示例。这是脚本之前的样子:

USE [my db name]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[ConsignmentGroups](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [ConsignmentID] [int] NOT NULL,
    [Name] [nvarchar](255) NOT NULL,
    [Notes] [nvarchar](255) NOT NULL,
    CONSTRAINT [PK_ConsignmentGroups] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[ConsignmentGroups] ADD  CONSTRAINT [DF_ConsignmentGroups_Notes]  DEFAULT ('') FOR [Notes]
GO
Run Code Online (Sandbox Code Playgroud)

这里的DEFAULT约束被编写为单独的ALTER TABLE语句。

这是现在的样子:

USE [my db name]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[ConsignmentGroups](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [ConsignmentID] [int] NOT NULL,
    [Name] [nvarchar](255) NOT NULL,
    [Notes] [nvarchar](255) NOT NULL CONSTRAINT [DF_ConsignmentGroups_Notes]  DEFAULT (''),
    CONSTRAINT [PK_ConsignmentGroups] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
Run Code Online (Sandbox Code Playgroud)

这里DEFAULT约束被内联到CREATE TABLE语句中。

并非所有有DEFAULT约束的表都会发生这种情况。大约有 60 个带有DEFAULT约束的表,其中至少一个仍被编写为ALTER TABLE语句。我认为没有人接触过上面例子中的表格 ( ConsignmentGroups),表格结构没有变化。唯一的变化是DEFAULT约束的风格。

问题在于,T-SQL 脚本中的这种更改被源代码控制作为更改选择。我想知道如何控制它以避免将来发生。

我假设我不小心更改了 SSMS 中的某些设置,而没有意识到它的作用。有谁知道这个设置在哪里?

我使用 SQL Server 2008 标准版

Microsoft SQL Server 2008 (SP4) - 10.0.6000.29 (X64) 
    Sep  3 2014 04:11:34 
    Copyright (c) 1988-2008 Microsoft Corporation
    Standard Edition (64-bit) on Windows NT 6.0 <X64> (Build 6002: Service Pack 2)
Run Code Online (Sandbox Code Playgroud)

SSMS 2012

Microsoft SQL Server Management Studio     11.0.6020.0
Microsoft Data Access Components (MDAC)    6.1.7601.17514
Microsoft MSXML                            3.0 4.0 5.0 6.0 
Microsoft Internet Explorer                9.11.9600.18376
Microsoft .NET Framework                   4.0.30319.42000
Operating System                           6.1.7601
Run Code Online (Sandbox Code Playgroud)

SSMS Boost版本 2.19.5952.29737

我有一段时间不记得更新任何这些组件或更改任何设置,但显然有些事情发生了变化。


我尝试使用 SSMS 2014 (12.0.4459.0) 生成这些脚本,而没有在我通常不使用的虚拟机上安装 SSMSBoost。

令我惊讶的是,结果是一样的。在不同计算机上运行的不同版本的 SSMS 生成的脚本是相同的。这意味着它不是 SSMS 中的设置,数据库本身中必须有一些东西。

此外,大约 60 个表中的一个表以不同的方式编写了不同的脚本这一事实表明此设置不是数据库范围的,而是在表级别上工作的。

Sco*_*red 3

这“可能”是问题所在,但似乎没有“解决方案”。我能够重现您的问题。有关此问题,请参阅此连接项目:

https://connect.microsoft.com/SQLServer/Feedback/Details/895113

SQL SMO 为表生成的默认值取决于表的行数。这使得无法以编程方式比较架构。

  • 是的,我见过这个 Connect 项目,但不幸的是它没有多大帮助。我试图弄清楚在 SSMS 脚本突然发生变化之前我做了什么。在我的例子中,SSMS 使用“ALTER TABLE”为所有表生成“DEFAULT”约束,无论它们有多少行。但现在它开始按照此连接项中所述的方式运行 - 它为空表和非空表生成不同的脚本。 (2认同)