在 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.
如果我执行脚本,创建一个内容完全相同的新脚本,但添加一个新列(--> id
、history
、isdeleted
和 timestamp
)会发生什么?它会自动添加新行吗?我认为是的,当然,但我不明白,如果该列应该是NOT NULL
、VARCHAR
、BIT
或类似的东西,它怎么会知道。它只会执行
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 17.6 中创建维护计划后,SSMS 会在尝试安排任务运行时自动重新启动