我知道这是一个很广泛的问题,但似乎网上没有资源可以回答我的疑问。
我注意到如果我在sql server
中重命名表,它会提示一个消息,说它可能影响或破坏表的根源。
那是什么意思?
它是否真的会破坏存储过程或脚本?
我知道这是一个很广泛的问题,但似乎网上没有资源可以回答我的疑问。
我注意到如果我在sql server
中重命名表,它会提示一个消息,说它可能影响或破坏表的根源。
那是什么意思?
它是否真的会破坏存储过程或脚本?
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')
DROP TABLE
,然后创建了一个与初始表名相同的 view
- 视图本身是从新表中选择的。这很好,因为我们无法重写所有旧代码,但我们希望优化新代码。 - gotqnCREATE SYNONYM dbo.OldTableName FOR dbo.NewTableName;
,所有引用旧表名的代码仍将正常工作,甚至查询优化器也不受影响(与视图相反)。但我自己从未使用过它们,这就是为什么我要问的原因。 - Tim Schmelter你可能需要考虑使用 SCHEMABINDING
选项来确保 视图 和 UDF 依赖的基础表/视图不会被更改(例如重命名)。
但请注意,a) 它是默认关闭的选项,b) 对于存储过程不可用,存储过程采用延迟名称解析。
因此,是的,视图、UDF 和存储过程定义都可以通过重命名表进行无效化,而只有使用 SCHEMABINDING
才能保护前两种。
以下是一张图片和一些代码,展示了如果不知道更改列的影响,您的视图将会出现问题。
创建视图
代码
/****** 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