在 ssms 中创建数据库模式脚本
Create a database schema-script in ssms
我在 sql 服务器上有一个功能齐全的数据库。大约40张桌子。我必须在多个其他 sql 服务器实例上安装此模式(仅模式,而不是数据)。 SSMS 提供了一种使用任务 --> 生成脚本自动生成模式的好方法。有点用,但我不确定我是否理解正确:
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, Status 1, Zeile 3
An die Spalte ist bereits ein DEFAULT-Wert gebunden.
翻译为:
Message 1781, level 16, status 1, line 3
A DEFAULT value is already bound to the column.
为什么会这样?
错误消息说之前有一个默认值分配给该列。
还有:
ALTER TABLE [dbo].[TableName] ADD CONSTRAINT [DF_TableName_id] DEFAULT (newid()) FOR [id]
不是添加新列的语法 - 这是将 NEWID() 的默认值添加到列 [id]。
要添加一个列,你应该遵循 this steps(里面有一个例子)。
另外 SQL 服务器如何从您手动添加的行中知道新列的设置?它只会允许您根据需要定义它们并接受语法是否正确,或者如果在脚本解析过程中不正确则通过错误接受(可以在 SSMS 中通过 [ctrl] + [F5] 完成)。
我在 sql 服务器上有一个功能齐全的数据库。大约40张桌子。我必须在多个其他 sql 服务器实例上安装此模式(仅模式,而不是数据)。 SSMS 提供了一种使用任务 --> 生成脚本自动生成模式的好方法。有点用,但我不确定我是否理解正确:
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, Status 1, Zeile 3 An die Spalte ist bereits ein DEFAULT-Wert gebunden.
翻译为:
Message 1781, level 16, status 1, line 3 A DEFAULT value is already bound to the column.
为什么会这样?
错误消息说之前有一个默认值分配给该列。 还有:
ALTER TABLE [dbo].[TableName] ADD CONSTRAINT [DF_TableName_id] DEFAULT (newid()) FOR [id]
不是添加新列的语法 - 这是将 NEWID() 的默认值添加到列 [id]。 要添加一个列,你应该遵循 this steps(里面有一个例子)。 另外 SQL 服务器如何从您手动添加的行中知道新列的设置?它只会允许您根据需要定义它们并接受语法是否正确,或者如果在脚本解析过程中不正确则通过错误接受(可以在 SSMS 中通过 [ctrl] + [F5] 完成)。