在 ssms 中创建数据库模式脚本

Posted

技术标签:

【中文标题】在 ssms 中创建数据库模式脚本【英文标题】:Create a database schema-script in ssms 【发布时间】:2017-03-15 08:24:35 【问题描述】:

我在 sql server 中有一个功能齐全的数据库。大约40张桌子。我必须在多个其他 sql server 实例上安装此架构(仅架构,而不是数据)。 SSMS 提供了一种使用 Tasks --> Generate Scripts 自动生成模式的好方法。它有点工作,但我不确定我是否理解正确:

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[TableName]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[TableName](
    [id] [uniqueidentifier] NOT NULL,
    [history] [varchar](max) NOT NULL,
    [isdeleted] [bit] NOT NULL,
 CONSTRAINT [PK_RecGroupData] PRIMARY KEY CLUSTERED 
(
    [rid] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
END

GO
IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[DF_TableName_id]') AND type = 'D')
BEGIN
ALTER TABLE [dbo].[TableName] ADD  CONSTRAINT [DF_TableName_id]  DEFAULT (newid()) FOR [id]
END
--Just showing one ALTER TABLE and IF NOT EXISTS. The others are generated in the same way.

如果我执行脚本,创建一个内容完全相同的新脚本,但添加一个新列(--> idhistoryisdeletedtimestamp)会发生什么?它会自动添加新行吗?我认为是的,当然,但我不明白,如果该列应该是NOT NULLVARCHARBIT 或类似的东西,它怎么会知道。它只会执行

ALTER TABLE [dbo].[TableName] ADD  CONSTRAINT [DF_TableName_id]  DEFAULT (newid()) FOR [id]

(id => 新样本列) 但是没有关于数据类型或任何其他修饰符的任何信息。 另外,如果我第二次像这样执行我的脚本,它会抛出一些错误:

Meldung 1781、Ebene 16、状态 1、Zeile 3 An die Spalte ist bereits ein DEFAULT-Wert gebunden。

意思是这样的:

消息 1781,第 16 级,状态 1,第 3 行 DEFAULT 值已绑定到该列。

为什么会这样?

【问题讨论】:

对不起,我不明白你的问题。您是否在问两个单独的问题 - 如何向表中添加列,以及“为什么我会收到 1781 号消息”? 是的,问题出在哪里?两个问题而不是一个问题,不是吗? 【参考方案1】:

错误消息是说之前为该列分配了一个默认值。 另外:

ALTER TABLE [dbo].[TableName] ADD  CONSTRAINT [DF_TableName_id]  DEFAULT (newid()) FOR [id]

不是添加新列的语法 - 这是将默认值 NEWID() 添加到列 [id]。 要添加一列,您应该关注this steps(里面有一个示例)。 此外,SQL Server 如何从您手动添加的行中知道新列的设置设置?它只会允许您根据需要定义它们,如果语法正确则接受,如果不是在脚本解析过程中则通过错误接受(可以通过 SSMS 中的 [ctrl] + [F5] 完成)。

【讨论】:

以上是关于在 ssms 中创建数据库模式脚本的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SSMS 2012 中创建唯一约束 [重复]

PostgreSQL:在特定数据库中创建模式

在 SSMS 17.6 中创建维护计划后,SSMS 会在尝试安排任务运行时自动重新启动

如何在 Powerdesigner 中创建可以为不同数据库生成创建脚本的模型?

无法在 dbo 模式中执行存储过程

在 Azure Synapse Analytics(Azure SQL 数据仓库)中创建外部数据源到 Oracle