2016-09-16 24 views
1

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 

それらの100Sがあります:(

は、名前のデフォルトのすべての名前を変更するには任意の「安全な」方法はあります「無名」とはみなさず、あらゆる環境でランダムな名前を持たないような適切な名前への制約?

私は上記のクエリを展開してsp_renameのステートメントを生成することを考えていました。私はwante最も安全な方法を見つけるためにd。

この問題を解決する最も信頼性が高く安全な方法は何ですか?

+0

これらの名前変更ステートメントを生成してください。 – Hogan

答えて

1

が含まsys.objectsに記載されているオブジェクト上で動作します@objtype = 'OBJECT'

を使用してsp_renameを使用して、名前を変更することができますが、私のために働いたスクリプトは次のとおりです。

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で囲んでテストします。

0

あなたはこれがここで制約

関連する問題