我已使用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)
)
答案 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脚本之后。