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

Posted

技术标签:

【中文标题】如何为整个数据库生成脚本【英文标题】:how to generate a script for the entire database 【发布时间】:2021-12-01 07:35:48 【问题描述】:

我已尝试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

【问题讨论】:

【参考方案1】:

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

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

然后运行

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

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

【讨论】:

非常感谢!任何关于查找所有自动生成的约束和索引的自动化解决方案的想法? 查看更新的答案。

以上是关于如何为整个数据库生成脚本的主要内容,如果未能解决你的问题,请参考以下文章

如何为使用 makefile 构建的整个项目生成一个大型依赖映射?

如何生成 Oracle 模式的整个 DDL(可编写脚本)?

如何为包含所有存储行的现有 SQL Server 表生成 INSERT 脚本?

如何为熊猫数据框添加唯一的字母数字 ID?

如何为整个作业选择打印机?

Symfony2:如何为整个应用程序强制使用 HTTPS?