在SSMS 2016 RC中为Azure数据库生成脚本省略了默认值

时间:2016-05-15 15:12:44

标签: sql-server azure constraints ssms

我已使用SSMS 2016候选版本中的内置迁移工具将本地SQL Server数据库迁移到Azure。除了使用Azure中不允许的功能的存储过程的大量失败转换外,它看起来还不错。

我现在使用相同的脚本选项从数据库的本地版本和Azure版本生成了架构的脚本,以便我可以比较数据库的脚本并识别任何差异或其他缺失的项目。

我的问题是从Azure生成的脚本不包含列的默认值约束。直接在SSMS中查看表定义表明已正确设置了默认值。

任何人都可以帮助我让SSMS脚本生成器将默认值约束添加到生成的脚本中吗?

这是来自本地数据库的示例脚本:

SET ANSI_NULLS ON
CREATE TABLE [xOrgBusinessType](
    [OrgID] [int] NOT NULL,
    [BusTypeID] [int] NOT NULL,
    [CRD] [datetime] NOT NULL CONSTRAINT [DF_xOrgBusinessType_CRD]  DEFAULT (getutcdate()),
    [CRDByID] [int] NOT NULL CONSTRAINT [DF_xOrgBusinessType_CRDByID]  DEFAULT ((0)),
 CONSTRAINT [PK_xOrgBusinessType] PRIMARY KEY CLUSTERED 
(
    [OrgID] ASC,
    [BusTypeID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) 

以及Azure数据库中的等效脚本

SET ANSI_NULLS ON
CREATE TABLE [xOrgBusinessType](
    [OrgID] [int] NOT NULL,
    [BusTypeID] [int] NOT NULL,
    [CRD] [datetime] NOT NULL,
    [CRDByID] [int] NOT NULL,
 CONSTRAINT [PK_xOrgBusinessType] PRIMARY KEY CLUSTERED 
(
    [OrgID] ASC,
    [BusTypeID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
)

1 个答案:

答案 0 :(得分:0)

我找到了自己问题的答案。比较两个数据库中的脚本时我犯了一个错误。本地数据库脚本由SSMS 2014生成,而Azure数据库脚本由SSMS 2016生成,两个版本对待CONSTRAINT .. DEFAULT ..以不同方式。

在2014年的情况下,约束使用列定义编写脚本。在2016年的情况下,所有约束都在以后的块中编写,如ALTER TABLE .. ADD CONSTRAINT ..命令。

虽然我的问题得到了解答,但SSMS 2016的方法似乎有些奇怪。对于上面的脚本,CREATE TABLE脚本位于第2500行附近,而ALTER TABLE脚本位于第13100行。此外,我已将选项设置为“包含描述性标题”,但ALTER TABLE语句前面没有一个对象头,即使脚本的那一部分定义了一个约束对象。

我想知道为什么ALTER TABLE语句到目前为止从表定义中删除了。似乎没有理由不将它们包含在CREATE TABLE脚本之后。