テーブルの名前をSQL Serverに変更し、PKとFKを使用して変更をカスケードします

StackOverflow https://stackoverflow.com/questions/191787

  •  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がこれを行います)、名前の検索と置換を行うことで実現できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top