【问题标题】:How to properly rename all of the unnamed default constraint如何正确重命名所有未命名的默认约束
【发布时间】:2016-09-16 20:42:34
【问题描述】:

使用 SQL Server 2014:我正在处理一个包含许多未命名默认约束的大型生产数据库。

未命名的默认约束会导致许多问题,因为它们在我填充数据库模式填充脚本的每个“DEV”或“QA”环境中都会获得一个随机名称。随机的默认约束名称会导致 SSDT 架构比较/更新脚本失败。

我需要将生产数据库的默认列约束正确命名为适当的名称,因此当我编写数据库架构脚本时,它们不会获得随机名称。

我使用以下查询来获取未命名的默认约束列表:

select 
    t.name, c.name, d.name, definition 
from 
    sys.tables t   
join    
    sys.default_constraints d on d.parent_object_id = t.object_id  
join    
    sys.columns c on c.object_id = t.object_id      
                  and c.column_id = d.parent_column_id

有 100 多个 :(

是否有任何“安全”的方法可以将所有未命名的默认约束重命名为适当的名称,这样它们就不会考虑“未命名”并且不会在每个环境中获得随机名称?

我正在考虑扩展上述查询并生成 sp_rename 语句。由于我正在处理生产数据库,因此我想找到最安全的方法。

解决这个问题最可靠和最安全的方法是什么?

【问题讨论】:

  • 去吧,生成那些重命名语句。

标签: sql-server


【解决方案1】:

这是对我有用的脚本:

select
    CONCAT
    (
        'exec sp_rename ',
        '   @objname = ''['+d.name+']''',
        ' , @newname =  ''DF_',t.name,'_',c.name,   '''',
        ' , @objtype = ''OBJECT'' ;'
    ), 
    t.name, c.name, d.name, definition 
from 
    sys.tables t   
join    
    sys.default_constraints d on d.parent_object_id = t.object_id  
join    
    sys.columns c on c.object_id = t.object_id      
                  and c.column_id = d.parent_column_id
ORDER BY t.name

只需将结果的第一列粘贴到新的查询窗口中,用BEGIN TRANSACTIONROLLBACK 将其包围以对其进行测试。

【讨论】:

    【解决方案2】:

    您可以使用sp_rename 重命名它,使用@objtype = 'OBJECT'

    这适用于 sys.objects 中列出的包含约束的对象

    【讨论】:

      猜你喜欢
      • 2020-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-13
      • 2010-10-14
      • 1970-01-01
      相关资源
      最近更新 更多