テーブルの名前をSQL Serverに変更し、PKとFKを使用して変更をカスケードします
-
08-07-2019 - |
質問
tblFooという名前のテーブルがあり、tblFooBarという名前を付けたい場合、これを実行できるsqlコマンドまたは何かを見つけたいです。ただし、主キーも変更する必要があります。たとえば、現在は次のとおりです。
CONSTRAINT [PK_tblFoo] PRIMARY KEY CLUSTERED
そして、名前を変更して次のように変更したい
CONSTRAINT [PK_tblFooBar] PRIMARY KEY CLUSTERED
次に、この変更を、次のような重要なキー関係を持つすべてのテーブルで繰り返し実行し、カスケードします。これから:
CHECK ADD CONSTRAINT [FK_tblContent_tblFoo] FOREIGN KEY([fooID])
これへ:
CHECK ADD CONSTRAINT [FK_tblContent_tblFooBar] FOREIGN KEY([fooID])
当然、a)これはエラーが発生しやすいプロセスであり、b)スケーリングしないため、すべてを手動で実行しないようにしようとしています。
解決
これは私の頭上にあり、完全ではありません(インデックスに同様のコードを追加する必要があります)。また、同じベース名のテーブルからオブジェクトの名前を変更することを避けるためにコードを追加する必要がありますが、追加の文字-たとえば、このコードはtblFoo2とそのすべての関連オブジェクトもリストします。うまくいけば、それはあなたのための始まりです。
DECLARE
@old_name VARCHAR(100),
@new_name VARCHAR(100)
SET @old_name = 'tblFoo'
SET @new_name = 'tblFooBar'
SELECT
'EXEC sp_rename ''' + name + ''', ''' + REPLACE(name, @old_name, @new_name) + ''''
FROM dbo.sysobjects
WHERE name LIKE '%' + @old_name + '%'
他のヒント
トムによる良い回答
ここで彼のクエリを拡張して、インデックスを含めました
declare
@old nvarchar(100),
@new nvarchar(100)
set @old = 'OldName'
set @new = 'NewName'
select 'EXEC sp_rename ''' + name + ''', ''' +
REPLACE(name, @old, @new) + ''''
from sys.objects
where name like '%' + @old + '%'
union -- index renames
select 'EXEC sp_rename ''' + (sys.objects.name + '.' + sys.indexes.name) + ''', ''' +
REPLACE(sys.indexes.name, @old, @new) + ''', ''INDEX'''
from sys.objects
left join sys.indexes on sys.objects.object_id = sys.indexes.object_id
where sys.indexes.name like '%' + @old + '%'
テーブルの名前を変更する手間を省く優れたツールは、 Red Gate SQLです。リファクタリング それは自動的にあなたの依存関係を見つけて、あなたのためにそれらすべてをうまく機能させます。
大ファン:-)
SQL Serverは、私の知る限りこれを直接行いません。変更を行うには、スクリプトを手動でビルドする必要があります。これは、テーブル定義のSQLを生成し(SSMSがこれを行います)、名前の検索と置換を行うことで実現できます。
所属していません StackOverflow