我知道这是一个广泛的问题,但似乎没有在线资源来回答我的疑问。
我注意到如果我在sql server
中重命名一个表,它会提示一条消息说它可能会影响或破坏表的根。
这是什么意思?
它是否真的破坏了存储过程或脚本?
答案 0 :(得分:4)
不确定。它将打破引用它的例程。您可以使用管理工作室查找引用它的对象:
或以下脚本:
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)。
答案 1 :(得分:3)
您可能需要考虑Views和UDF的SCHEMABINDING
选项的存在。这些允许您确保View或UDF所依赖的基础表/视图不会被更改(例如通过重命名)。
但请注意a)它是一个选项默认情况下已关闭; b)它不适用于存储过程,而这些存储过程完全在另一个存储过程中通过推迟名称解析来确定方向。
所以,可以通过重命名表来使视图,UDF和存储过程定义无效,并且只能通过使用SCHEMABINDING
来保护前两个。
答案 2 :(得分:2)
这是一张图片和一些代码,例如,如果您不知道更改后的列有什么影响,您的视图就会中断。
创建视图
<强>代码强>
/****** 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