documentation では、次のように明確に述べられています。
オブジェクト名の一部を変更すると、スクリプトとストアドプロシージャが破損する可能性があります。このステートメントを使用して、ストアドプロシージャ、トリガー、ユーザー定義関数、またはビューの名前を変更しないことをお勧めします。代わりに、オブジェクトをドロップし、新しい名前で再作成してください。
名前の変更について:
上記のすべてのオブジェクトの名前を、内部の命名規則に合わせるために変更しますが、これを行うための自動スクリプトを記述したいと思います(数千の制約があるため)。
私が考えることができる唯一の問題は、ステートメントでhint
を使用してインデックスを使用すると、インデックスが壊れることです。
そのような目的でsp_rename
を使用しない他の理由を教えていただけますか?
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_modules
のdefinition
列には、まだ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 [〜#〜] )