我一直在使用 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 个表中的一个表以不同的方式编写了不同的脚本这一事实表明此设置不是数据库范围的,而是在表级别上工作的。
这“可能”是问题所在,但似乎没有“解决方案”。我能够重现您的问题。有关此问题,请参阅此连接项目:
https://connect.microsoft.com/SQLServer/Feedback/Details/895113
SQL SMO 为表生成的默认值取决于表的行数。这使得无法以编程方式比较架构。