sp_rename (Transact-SQL)
現在のデータベースでユーザーが作成したオブジェクトの名前を変更します。このオブジェクトには、テーブル、インデックス、列、別名データ型、または Microsoft .NET Framework 共通言語ランタイム (CLR) ユーザー定義型を指定できます。
注意 |
---|
オブジェクト名の一部または全部を変更すると、スクリプトおよびストアド プロシージャが壊れる可能性があります。ストアド プロシージャ、トリガー、ユーザー定義関数、またはビューの名前を変更する場合は、このステートメントを使用しないことをお勧めします。代わりに、オブジェクトを削除して新しい名前で再作成してください。 |
構文
sp_rename [ @objname = ] 'object_name' , [ @newname = ] 'new_name'
[ , [ @objtype = ] 'object_type' ]
引数
[ @objname = ] 'object_name'
ユーザー オブジェクトやデータ型に関する現在の修飾名または非修飾名を指定します。名前を変更するオブジェクトがテーブル内の列である場合、object_name は table.column または schema.table.column の形式で指定する必要があります。名前を変更するオブジェクトがインデックスである場合、object_name は table.index または schema.table.index の形式で指定する必要があります。名前を変更するオブジェクトが制約である場合、object_name は schema.constraint の形式で指定する必要があります。引用符は、修飾オブジェクトを指定する場合のみ必要です。データベース名を含む完全修飾名を指定する場合、データベース名は現在のデータベースの名前である必要があります。object_name のデータ型は nvarchar(776) で、既定値はありません。
[ @newname = ] 'new_name'
指定したオブジェクトの新しい名前を指定します。new_name には、1 つの要素で構成される、識別子の規則に従った名前を指定する必要があります。newname のデータ型は sysname で、既定値はありません。注 トリガー名の先頭に # または ## は使用できません。
[ @objtype = ] 'object_type'
名前を変更するオブジェクトの種類を指定します。object_type のデータ型は varchar(13) で、既定値は NULL です。次のいずれかの値を指定できます。値
説明
COLUMN
名前を変更する列。
DATABASE
ユーザー定義のデータベース。データベースの名前を変更する場合は、このオブジェクトの種類が必要です。
INDEX
ユーザー定義のインデックス。統計のあるインデックスの名前を変更すると、統計の名前も自動的に変更されます。
OBJECT
sys.objects に記録される型の項目。たとえば、OBJECT を使用して、制約 (CHECK、FOREIGN KEY、PRIMARY/UNIQUE KEY)、ユーザー テーブル、ルールなどのオブジェクトの名前を変更できます。
STATISTICS
ユーザーによって明示的に作成された統計、作成またはインデックスで暗黙的に作成された統計です。インデックスの統計の名前を変更すると、インデックスの名前も自動的に変更されます。
USERDATATYPE
CREATE TYPE または sp_addtype を実行すると追加される CLR ユーザー定義型。
リターン コード値
0 (成功) または 0 以外の数値 (失敗)
説明
名前を変更できるのは、現在のデータベース内にあるオブジェクトまたはデータ型だけです。ほとんどのシステム データ型およびシステム オブジェクトの名前は変更できません。
sp_rename では、PRIMARY KEY (主キー) または UNIQUE (一意) 制約の名前を変更した場合、関連するインデックスの名前も自動的に変更されます。名前を変更したインデックスが PRIMARY KEY 制約に関連付けられている場合は、sp_rename によって PRIMARY KEY 制約の名前も自動的に変更されます。
sp_rename は、プライマリおよびセカンダリ XML インデックスの名前を変更する場合に使用できます。
ストアド プロシージャ、関数、ビュー、またはトリガーの名前を変更しても、sys.sql_modules カタログ ビューの definition 列にある、対応するオブジェクトの名前は変更されません。したがって、これらのオブジェクトの種類の名前を変更する場合は、sp_rename を使用しないことをお勧めします。代わりに、オブジェクトを削除して新しい名前で再作成してください。
テーブルや列などのオブジェクトの名前を変更しても、そのオブジェクトに対する参照は自動的には変更されません。名前を変更したオブジェクトを参照しているオブジェクトに対しては、手動で変更を加える必要があります。たとえば、テーブルの列の名前を変更するとき、その列がトリガーで参照されている場合は、新しい列名が反映されるようにトリガーに変更を加える必要があります。オブジェクトの名前を変更する前には、sys.sql_expression_dependencies を使用してオブジェクトの従属関係を一覧表示できます。
権限
オブジェクト、列、およびインデックスの名前を変更するには、そのオブジェクトに対する ALTER 権限が必要です。ユーザー定義型の名前を変更するには、その型に対する CONTROL 権限が必要です。データベースの名前を変更するには、sysadmin 固定サーバー ロールまたは dbcreator 固定サーバー ロールのメンバーシップが必要です。
使用例
A. テーブル名を変更する
次の例では、Sales スキーマの SalesTerritory テーブルの名前を SalesTerr に変更します。
USE AdventureWorks2012;
GO
EXEC sp_rename 'Sales.SalesTerritory', 'SalesTerr';
GO
B. 列名を変更する
次の例では、SalesTerritory テーブル内の TerritoryID 列の名前を TerrID に変更します。
USE AdventureWorks2012;
GO
EXEC sp_rename 'Sales.SalesTerritory.TerritoryID', 'TerrID', 'COLUMN';
GO
C. インデックス名を変更する
次の例では、IX_ProductVendor_VendorID インデックスの名前を IX_VendorID に変更します。
USE AdventureWorks2012;
GO
EXEC sp_rename N'Purchasing.ProductVendor.IX_ProductVendor_VendorID', N'IX_VendorID', N'INDEX';
GO
D. 別名データ型の名前を変更する
次の例では、Phone 別名データ型の名前を Telephone に変更します。
USE AdventureWorks2012;
GO
EXEC sp_rename N'Phone', N'Telephone', N'USERDATATYPE';
GO
E. 制約の名前を変更する
次の例では、PRIMARY KEY 制約、CHECK 制約、および FOREIGN KEY 制約の名前を変更します。制約の名前を変更する際は、制約が属するスキーマを指定する必要があります。
USE AdventureWorks2012;
GO
-- Return the current Primary Key, Foreign Key and Check constraints for the Employee table.
SELECT name, SCHEMA_NAME(schema_id) AS schema_name, type_desc
FROM sys.objects
WHERE parent_object_id = (OBJECT_ID('HumanResources.Employee'))
AND type IN ('C','F', 'PK');
GO
-- Rename the primary key constraint.
sp_rename 'HumanResources.PK_Employee_BusinessEntityID', 'PK_EmployeeID';
GO
-- Rename a check constraint.
sp_rename 'HumanResources.CK_Employee_BirthDate', 'CK_BirthDate';
GO
-- Rename a foreign key constraint.
sp_rename 'HumanResources.FK_Employee_Person_BusinessEntityID', 'FK_EmployeeID';
-- Return the current Primary Key, Foreign Key and Check constraints for the Employee table.
SELECT name, SCHEMA_NAME(schema_id) AS schema_name, type_desc
FROM sys.objects
WHERE parent_object_id = (OBJECT_ID('HumanResources.Employee'))
AND type IN ('C','F', 'PK');
name schema_name type_desc
------------------------------------- ------------------ ----------------------
FK_Employee_Person_BusinessEntityID HumanResources FOREIGN_KEY_CONSTRAINT
PK_Employee_BusinessEntityID HumanResources PRIMARY_KEY_CONSTRAINT
CK_Employee_BirthDate HumanResources CHECK_CONSTRAINT
CK_Employee_MaritalStatus HumanResources CHECK_CONSTRAINT
CK_Employee_HireDate HumanResources CHECK_CONSTRAINT
CK_Employee_Gender HumanResources CHECK_CONSTRAINT
CK_Employee_VacationHours HumanResources CHECK_CONSTRAINT
CK_Employee_SickLeaveHours HumanResources CHECK_CONSTRAINT
(7 row(s) affected)
name schema_name type_desc
------------------------------------- ------------------ ----------------------
FK_Employee_ID HumanResources FOREIGN_KEY_CONSTRAINT
PK_Employee_ID HumanResources PRIMARY_KEY_CONSTRAINT
CK_BirthDate HumanResources CHECK_CONSTRAINT
CK_Employee_MaritalStatus HumanResources CHECK_CONSTRAINT
CK_Employee_HireDate HumanResources CHECK_CONSTRAINT
CK_Employee_Gender HumanResources CHECK_CONSTRAINT
CK_Employee_VacationHours HumanResources CHECK_CONSTRAINT
CK_Employee_SickLeaveHours HumanResources CHECK_CONSTRAINT
(7 row(s) affected)
F. 統計の名前を変更する
次の例では、contactMail1 という名前の統計オブジェクトを作成した後、sp_rename を使用して統計の名前を NewContact に変更します。統計の名前を変更する際は、オブジェクトを schema.table.statistics_name の形式で指定する必要があります。
CREATE STATISTICS ContactMail1
ON Person.Person (BusinessEntityID, EmailPromotion)
WITH SAMPLE 5 PERCENT;
sp_rename 'Person.Person.ContactMail1', 'NewContact','Statistics';
関連項目
参照
sys.sql_expression_dependencies (Transact-SQL)
sys.sql_modules (Transact-SQL)