テーブルの名前が変更された場合、テーブルの外部キー関係はどうなりますか?
テーブルの名前を変更しても、そのテーブルの基になるobject_idは変更されません。外部キーの関係は、object_idを使用して追跡されます。
select * from sys.foreign_keys
の情報をご覧ください。
次の親/子テーブルを想定
DROP TABLE IF EXISTS [dbo].[QueueDatabase];
DROP TABLE if exists [dbo].[Queue];
GO
CREATE TABLE [dbo].[Queue](
[QueueID] [int] IDENTITY(1,1) NOT NULL,
[SchemaName] [sysname] NOT NULL,
[ObjectName] [sysname] NOT NULL,
[Parameters] [nvarchar](max) NOT NULL,
[QueueStartTime] [datetime] NULL,
[SessionID] [smallint] NULL,
[RequestID] [int] NULL,
[RequestStartTime] [datetime] NULL,
CONSTRAINT [PK_Queue] PRIMARY KEY CLUSTERED
(
[QueueID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
CREATE TABLE [dbo].[QueueDatabase](
[QueueID] [int] NOT NULL,
[DatabaseName] [sysname] NOT NULL,
[DatabaseOrder] [int] NULL,
[DatabaseStartTime] [datetime] NULL,
[DatabaseEndTime] [datetime] NULL,
[SessionID] [smallint] NULL,
[RequestID] [int] NULL,
[RequestStartTime] [datetime] NULL,
CONSTRAINT [PK_QueueDatabase] PRIMARY KEY CLUSTERED
(
[QueueID] ASC,
[DatabaseName] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[QueueDatabase] WITH CHECK ADD CONSTRAINT [FK_QueueDatabase_Queue] FOREIGN KEY([QueueID])
REFERENCES [dbo].[Queue] ([QueueID])
GO
ALTER TABLE [dbo].[QueueDatabase] CHECK CONSTRAINT [FK_QueueDatabase_Queue]
GO
次に、トランザクションを開始します。 sp_renameを実行する前後に、object_idとobject_namesを選択します。 object_namesは変更されますが、基になるobject_idは変わりません。
begin transaction
--select object_id's and names before table rename
SELECT parent_object_id AS child_table_id
,object_name(parent_object_id) AS child_table
,referenced_object_id AS parent_table_id
,object_name(referenced_object_id) AS parent_table
FROM sys.foreign_keys
--rename the table
exec sp_rename 'dbo.queuedatabase','newqueuedatabase'
--select object_id's and names after table rename
SELECT parent_object_id AS child_table_id
,object_name(parent_object_id) AS child_table
,referenced_object_id AS parent_table_id
,object_name(referenced_object_id) AS parent_table
FROM sys.foreign_keys
--rollback
- 前
| child_table_id | child_table | parent_table_id | parent_table |
|----------------|---------------|-----------------|--------------|
| 1100687119 | QueueDatabase | 1068687005 | Queue |
-後
| child_table_id | child_table | parent_table_id | parent_table |
|----------------|------------------|-----------------|--------------|
| 1100687119 | newqueuedatabase | 1068687005 | Queue |
さらに、外部キーのname
に不思議なことは何も起こらないことに注意してください(外部キー名の一部としてテーブル名を使用した場合)
sys.foreign_keys
から選択すると、名前が変更された後にQueueDatabaseと呼ばれるテーブルがないため、少し混乱しますが、名前は同じままです。
FK_QueueDatabase_Queue
列AID, AName
およびtableA
が列BID, BName, AID
およびtableB.AID
参照tableA.AID
であるtableB
があるとします。
tableA
の名前をzTableA
に変更すると、zTableA
ではなくTableA
を参照するようにtableB.AID
の外部キー定義が更新されます
この動作は、テーブルの名前変更の前後に外部キーをスクリプト化することにより、Management Studioで確認できます。