web-dev-qa-db-ja.com

オブジェクトの名前を変更するためにsp_renameを使用しない理由はありますか?

documentation では、次のように明確に述べられています。

オブジェクト名の一部を変更すると、スクリプトとストアドプロシージャが破損する可能性があります。このステートメントを使用して、ストアドプロシージャ、トリガー、ユーザー定義関数、またはビューの名前を変更しないことをお勧めします。代わりに、オブジェクトをドロップし、新しい名前で再作成してください。

名前の変更について:

  • 主キー
  • 一意のキー
  • 外部キー
  • デフォルトの制約
  • インデックス

上記のすべてのオブジェクトの名前を、内部の命名規則に合わせるために変更しますが、これを行うための自動スクリプトを記述したいと思います(数千の制約があるため)。

私が考えることができる唯一の問題は、ステートメントでhintを使用してインデックスを使用すると、インデックスが壊れることです。

そのような目的でsp_renameを使用しない他の理由を教えていただけますか?

6
gotqn
  • 更新

sp_renameはsys.objectsの名前を更新しますが、それを参照する定義またはオブジェクトを更新しません。

  • オブジェクト定義

ストアドプロシージャ、関数、ビュー、またはトリガーの名前を変更しても、sys.sql_modulesカタログビューの定義列にある対応するオブジェクトの名前は変更されません。したがって、sp_renameを使用してこれらのオブジェクトタイプの名前を変更しないことをお勧めします。代わりに、オブジェクトをドロップして、新しい名前で再作成してください。 ( [〜#〜] msdn [〜#〜]

このクエリを実行すると:

Create Procedure Test
as
begin
    set nocount on
end
Go
Exec sp_rename 'Test', 'Tests'
GO
Select * From sys.sql_modules
sp_helptext 'Tests'

sql_modulesdefinition列には、まだTestが含まれています。

object_id   definition ...
599673184   Create Procedure Test as begin set nocount on Select id From T1 end
  • テーブル(またはオブジェクト)の名前を変更する

オブジェクトの名前を変更すると、それを使用して古い名前を参照するオブジェクトは失敗します。

名前が変更されたビューとテーブルを次に示します。

Create Table T1(id int)
Go
Create View V1 AS Select id From dbo.T1
Go  
Exec sp_rename 'T1', 'T2'

ここでも、定義を見ると、プロシージャとビュー参照T1(これはもう存在しません)の両方です。

object_id   definition
759673754   Create Procedure Test as begin set nocount on Select id From T1 end
791673868   Create View V1 AS Select id From dbo.T1

そして、それを選択するか実行すると、どちらもこのエラーで失敗します:

Invalid object name 'dbo.T1'.
Could not use view or function 'V1' because of binding errors.

ビューを更新すると、同じエラーが発生します。

sp_refreshview 'v1'

古い名前への参照を持つすべてのオブジェクトは壊れます。

  • 依存関係

オブジェクト(テーブル、プロシージャ、関数など)の名前を変更する前に、sys.sql_expression_dependencies[〜#〜] msdn [〜#〜] )を使用してその依存関係を確認できます(非推奨:sys.sql_dependencies[〜#〜] msdn [〜#〜]sys.sysdepends[〜#〜] msdn [〜#〜]

6