Sco*_*red 6

重命名表不会更改该表的基础 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
Run Code Online (Sandbox Code Playgroud)

现在,开始交易。在执行 sp_rename 之前和之后选择 object_id's 和 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
Run Code Online (Sandbox Code Playgroud)

- 前

| child_table_id | child_table   | parent_table_id | parent_table |
|----------------|---------------|-----------------|--------------|
| 1100687119     | QueueDatabase | 1068687005      | Queue        |
Run Code Online (Sandbox Code Playgroud)

- 后

| child_table_id | child_table      | parent_table_id | parent_table |
|----------------|------------------|-----------------|--------------|
| 1100687119     | newqueuedatabase | 1068687005      | Queue        |
Run Code Online (Sandbox Code Playgroud)

此外,应该注意的name是,外键的没有发生任何神奇的事情(假设您使用表名作为外键名的一部分)

选择 fromsys.foreign_keys显示名称保持不变,即使现在有点混乱,因为重命名后没有名为 QueueDatabase 的表。

FK_QueueDatabase_Queue
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

1751 次

最近记录:

7 年,1 月 前