SQL 服务器为什么我必须在 table 更改后刷新视图
SQL Server why must I refresh views after table changes
这个问题来自我之前 post/solution 的问题:
IMO 它值得拥有 post。使用 SQL Server 2008 R2。
为什么在向视图中引用的 table 添加列后必须刷新视图?虽然没有必要直接回答这个 post/question,但针对我的特定情况的 scenario/behavior 已在上面链接的 post 中进行了解释。
我不太喜欢观点。老实说,我很少创建它们,我正在使用我最初没有编写的代码。假设您有 70 多个视图,这些视图不是您最初编写的,因此不知道每次添加数据库列时哪些视图需要刷新。坦率地说,我应该能够随时添加任何专栏 table 而不会产生任何影响。业务部门可以提出任何类型的更改请求,可能需要随时添加任意数量的字段。
当然还有另一种方法吗?
使用动态管理视图确定哪些视图受到您的 table 更改的影响,然后遍历受影响视图的结果以使用动态 sql 调用 sp_refreshview
( https://msdn.microsoft.com/en-us/library/ms187821(v=sql.105).aspx)
这里有一个快速脚本,您可以根据需要将其改编为存储过程:
DECLARE @TableName VARCHAR(500) = 'dbo.Accounts'
DECLARE @ViewsToUpdate TABLE (ViewName VARCHAR(500))
INSERT @ViewsToUpdate
SELECT
Views.TABLE_SCHEMA + '.' + Views.TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES [Views]
INNER JOIN sys.dm_sql_referencing_entities(@TableName, 'OBJECT') DependingViews
ON DependingViews.referencing_schema_name = Views.TABLE_SCHEMA
AND DependingViews.referencing_entity_name = Views.TABLE_NAME
WHERE [Views].TABLE_TYPE = 'View'
WHILE EXISTS (SELECT * FROM @ViewsToUpdate) BEGIN
DECLARE @ViewName VARCHAR(500) = (SELECT TOP 1 ViewName FROM @ViewsToUpdate)
DECLARE @Sql NVARCHAR(1000) = 'EXEC sp_refreshview ''' + @ViewName + ''''
EXEC sys.sp_executesql @Sql
DELETE @ViewsToUpdate WHERE ViewName = @ViewName
END
这个问题来自我之前 post/solution 的问题:
IMO 它值得拥有 post。使用 SQL Server 2008 R2。
为什么在向视图中引用的 table 添加列后必须刷新视图?虽然没有必要直接回答这个 post/question,但针对我的特定情况的 scenario/behavior 已在上面链接的 post 中进行了解释。
我不太喜欢观点。老实说,我很少创建它们,我正在使用我最初没有编写的代码。假设您有 70 多个视图,这些视图不是您最初编写的,因此不知道每次添加数据库列时哪些视图需要刷新。坦率地说,我应该能够随时添加任何专栏 table 而不会产生任何影响。业务部门可以提出任何类型的更改请求,可能需要随时添加任意数量的字段。
当然还有另一种方法吗?
使用动态管理视图确定哪些视图受到您的 table 更改的影响,然后遍历受影响视图的结果以使用动态 sql 调用 sp_refreshview
( https://msdn.microsoft.com/en-us/library/ms187821(v=sql.105).aspx)
这里有一个快速脚本,您可以根据需要将其改编为存储过程:
DECLARE @TableName VARCHAR(500) = 'dbo.Accounts'
DECLARE @ViewsToUpdate TABLE (ViewName VARCHAR(500))
INSERT @ViewsToUpdate
SELECT
Views.TABLE_SCHEMA + '.' + Views.TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES [Views]
INNER JOIN sys.dm_sql_referencing_entities(@TableName, 'OBJECT') DependingViews
ON DependingViews.referencing_schema_name = Views.TABLE_SCHEMA
AND DependingViews.referencing_entity_name = Views.TABLE_NAME
WHERE [Views].TABLE_TYPE = 'View'
WHILE EXISTS (SELECT * FROM @ViewsToUpdate) BEGIN
DECLARE @ViewName VARCHAR(500) = (SELECT TOP 1 ViewName FROM @ViewsToUpdate)
DECLARE @Sql NVARCHAR(1000) = 'EXEC sp_refreshview ''' + @ViewName + ''''
EXEC sys.sp_executesql @Sql
DELETE @ViewsToUpdate WHERE ViewName = @ViewName
END