如何为整个数据库生成脚本
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 构建的整个项目生成一个大型依赖映射?