如何正确重命名所有未命名的默认约束

时间:2016-09-16 20:42:34

标签: sql-server

使用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语句。由于我正在处理生产数据库,我想找到最安全的方法。

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

2 个答案:

答案 0 :(得分:2)

以下是适用于我的脚本:

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

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

答案 1 :(得分:0)

您可以使用ItemType

使用PageType重命名

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

的对象