Sql server- 重命名表名会产生负面影响吗?

3

我知道这是一个很广泛的问题,但似乎网上没有资源可以回答我的疑问。

我注意到如果我在sql server中重命名表,它会提示一个消息,说它可能影响或破坏表的根源。

那是什么意思?

它是否真的会破坏存储过程或脚本?


1
如果你用那个名字引用了某个东西,然后改变它,那么它就会出问题。它不会重命名该表名的每个实例。 - Keith
1
如果您重命名一个列,您应该考虑是否有任何前端应用程序在该表上。它们将会中断。如果您指定了特定的列,视图也会中断。 - SqlKindaGuy
3个回答

4
当然可以。这将会打破引用它的例程。您可以使用管理工具来查找引用它的对象:

enter image description here

或以下脚本:
DECLARE @SearchWord NVARCHAR(128) = 'table'

SELECT ROUTINE_NAME
FROM INFORMATION_SCHEMA.ROUTINES 
WHERE ROUTINE_DEFINITION LIKE '%'+@SearchWord+'%' 
UNION
SELECT OBJECT_NAME(id) 
FROM SYSCOMMENTS 
WHERE [text] LIKE '%'+@SearchWord+'%' 
GROUP BY OBJECT_NAME(id)
UNION 
SELECT OBJECT_NAME(object_id)
FROM sys.sql_modules
WHERE definition LIKE '%'+@SearchWord+'%' 

RETURN

SELECT *
FROM sys.dm_sql_referenced_entities ('dbo.table', 'OBJECT')

SELECT *
FROM sys.dm_sql_referencing_entities ('dbo.table', 'OBJECT')

此外,最好查找您的服务器端文件(asp、.net),并检查该表是否在SSIS包或报告文件(.rdl)中使用。

创建同义词是否有助于在重命名表时避免破坏某些内容? - Tim Schmelter
我们在生产环境中做过类似的事情。为了应用规范化(将表拆分为五个单独的表),我们使用了 DROP TABLE,然后创建了一个与初始表名相同的 view - 视图本身是从新表中选择的。这很好,因为我们无法重写所有旧代码,但我们希望优化新代码。 - gotqn
1
我猜 同义词 可能会更好。只需重命名表即可。然后使用 CREATE SYNONYM dbo.OldTableName FOR dbo.NewTableName;,所有引用旧表名的代码仍将正常工作,甚至查询优化器也不受影响(与视图相反)。但我自己从未使用过它们,这就是为什么我要问的原因。 - Tim Schmelter

3

你可能需要考虑使用 SCHEMABINDING 选项来确保 视图 和 UDF 依赖的基础表/视图不会被更改(例如重命名)。

但请注意,a) 它是默认关闭的选项,b) 对于存储过程不可用,存储过程采用延迟名称解析。

因此,是的,视图、UDF 和存储过程定义都可以通过重命名表进行无效化,而只有使用 SCHEMABINDING 才能保护前两种。


2

以下是一张图片和一些代码,展示了如果不知道更改列的影响,您的视图将会出现问题。

创建视图

enter image description here

编辑列名并从视图中选择 enter image description here

代码

   /****** Script for SelectTopNRows command from SSMS  ******/

  /*Main table*/
 SELECT TOP 1000 [Person]
     ,[Book]
 FROM [LegOgSpass].[dbo].[Books]


 /*Create view*/
 create view dbo.booksview as

 select person,Book from dbo.Books

 /*Selcet from view*/
 Select * from dbo.booksview


 /*Change column name*/
 /****** Object:  Table [dbo].[Books]    Script Date: 03-11-2017 09:42:52 ******/
  DROP TABLE [dbo].[Books]
 GO

 /****** Object:  Table [dbo].[Books]    Script Date: 03-11-2017 09:42:52 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Books](
[PersonNEW] [nvarchar](50) NULL,
[Book] [nvarchar](50) NULL
) ON [PRIMARY]

GO

/*Select from view again with Person changed to PersonNew*/
Select * from dbo.booksview

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接