【问题标题】: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

【问题讨论】:

    标签: sql tsql azure-sql-database ssms


    【解决方案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
    

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

    【讨论】:

    • 非常感谢!任何关于查找所有自动生成的约束和索引的自动化解决方案的想法?
    • 查看更新的答案。
    猜你喜欢
    • 2019-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-09
    相关资源
    最近更新 更多