如何为整个数据库生成脚本

how to generate a script for the entire database

我已经尝试 generate scripts。我已经使用了这两个选项:

尝试执行生成的脚本时,它会在初始数据库创建时起作用。

所有后续尝试 运行 生成的脚本都会导致以下错误:

Msg 1781, Level 16, State 1, Line 8739
Column already has a DEFAULT bound to it.
Msg 1750, Level 16, State 0, Line 8739
Could not create constraint or index. See previous errors.

此代码似乎适用于初始数据库创建但不适用于后续执行:

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[cfg].[DF__LookupCol__IsPri__46DD686B]') AND type = 'D')
BEGIN
ALTER TABLE [cfg].[LookupColumns] ADD  DEFAULT (CONVERT([bit],(0))) FOR [IsPrimaryKey]
END
GO

我也试过了,结果一样:

ALTER TABLE [cfg].[LookupColumns] ADD CONSTRAINT LookupColumnsIsPrimaryKeyConstraint DEFAULT (CONVERT([bit],(0))) FOR [IsPrimaryKey]

我做错了什么?这个错误是什么意思? 列已经绑定了 DEFAULT?

这确实是因为你没有命名你的约束,所以它第二次尝试删除 名称然后添加一个额外的约束。

第一次 运行 脚本会检查名为 DF__LookupCol__IsPri__46DD686B 的默认约束,这当然不存在。

然后运行s

ALTER TABLE [cfg].[LookupColumns] ADD DEFAULT (CONVERT([bit],(0))) FOR [IsPrimaryKey]

这会创建一个新约束,其名称为 new 自动生成的名称。下次你 运行 脚本时,它会尝试再次删除 DF__LookupCol__IsPri__46DD686B,但它仍然不存在,然后尝试添加一个新的约束,但失败了。

因此,为了能够重新运行这个脚本,您应该在生成脚本之前命名所有约束和索引。

您可以像这样找到系统命名的默认约束:

select name, object_name(object_id) table_name 
from sys.default_constraints 
where is_system_named = 1

select name, object_name(object_id) table_name 
from sys.check_constraints 
where is_system_named = 1

select name, object_name(object_id) table_name 
from sys.key_constraints 
where is_system_named = 1

等等

或者您可以在名称中查找 __,但您当然希望手动查看这些名称。