Sql server 为什么SQL Server视图需要每隔一段时间刷新一次

Sql server 为什么SQL Server视图需要每隔一段时间刷新一次,sql-server,refresh,sql-view,Sql Server,Refresh,Sql View,为什么每次向视图添加或编辑某些字段时,我都必须编写“刷新视图”脚本,并执行它们 SQL Server知道在Management Studio中的fancy view edit(高级视图编辑)窗口中编辑视图时需要刷新视图,因此,为什么它不能在通过脚本编辑视图后告诉其视图自行刷新?如果基础表发生任何更改,则需要刷新视图。可以更改视图列的数据类型或重新排列其索引。因此,它需要知道。否则,你会对它运行一个查询,它会很快爆炸 您不必运行sp\u refreshview来更改视图。仅用于更改其基础表 另外,

为什么每次向视图添加或编辑某些字段时,我都必须编写“刷新视图”脚本,并执行它们


SQL Server知道在Management Studio中的fancy view edit(高级视图编辑)窗口中编辑视图时需要刷新视图,因此,为什么它不能在通过脚本编辑视图后告诉其视图自行刷新?

如果基础表发生任何更改,则需要刷新视图。可以更改视图列的数据类型或重新排列其索引。因此,它需要知道。否则,你会对它运行一个查询,它会很快爆炸

您不必运行
sp\u refreshview
来更改视图。仅用于更改其基础表

另外,请不要嘲笑快乐舞会

编辑:只需(连续)运行此代码,尝试重现您的问题。不幸的是,我无法按预期工作(SQL Server 2008):

在视图定义中使用可消除任何刷新的需要

并与ALTER VIEW结合使用,而不是与设计器结合使用

编辑,2012年7月,来自上面的链接。我的大胆

策划

将视图绑定到基础表的架构。指定SCHEMABINDING时,不能以影响视图定义的方式修改基表。必须首先修改或删除视图定义本身,以删除对要修改的表的依赖关系。使用SCHEMABINDING时,select_语句必须包含引用的表、视图或用户定义函数的两部分名称(schema.object)。所有引用的对象必须位于同一数据库中

不能删除参与使用SCHEMABINDING子句创建的视图的视图或表,除非删除或更改该视图,使其不再具有架构绑定。否则,数据库引擎将引发错误。此外,当参与具有模式绑定的视图的表上的ALTER TABLE语句影响视图定义时,执行这些语句也会失败


我对表格更改也有同样的问题。真正的解决方案是alter table的DDL触发器:

Create Trigger RefreshViewTrigger On Database FOr Alter_Table As
Declare @tname as nvarchar(256), @sql nvarchar(400);
Select @tname = EVENTDATA().value('(/EVENT_INSTANCE/SchemaName)[1]','nvarchar(100)')  + '.' +  EVENTDATA().value('(/EVENT_INSTANCE/ObjectName)[1]','nvarchar(100)');
Declare k cursor For Select distinct 'sp_refreshview ''' + o.name + '''' sql
    From sys.objects o Join sys.sql_expression_dependencies s On o.object_id = s.referencing_id   
    Where o.type = 'V' AND s.referenced_id = Object_id(@tname);  
Open k
Fetch Next from k into @sql
While @@FETCH_STATUS = 0
Begin
    Print( @sql )
    EXEC( @sql )
    Fetch Next from k into @sql
End
Close k
Deallocate k
Go

我在2008 R2上工作,甚至可能是更早的版本。

我犹豫了一下是否建议这样做
WITH SCHEMABINDING
仅当表都位于同一服务器上的同一数据库中时才起作用。如果与SCHEMABINDING一起使用,则无需进行任何刷新,因为这样可以防止更改基础表。如果您必须更改基础表,那么最好的方法就是提醒您,在删除要进行更改的schemabinding时,您需要在之后更新视图。我不认为阻止更改与删除刷新的需要是多么的等价?除非我错误地认为使用SCHEMABINDING可以防止底层表被更改?但是当我使用类似于从b中选择b.*的内容时,这种行为也会发生。将列添加到b后,视图尝试显示旧列,即使它们不是硬编码的。Eric的注释仍然有效。只要基础表的架构发生更改,就需要刷新视图的元数据,即使视图的代码保持正确。
Create Trigger RefreshViewTrigger On Database FOr Alter_Table As
Declare @tname as nvarchar(256), @sql nvarchar(400);
Select @tname = EVENTDATA().value('(/EVENT_INSTANCE/SchemaName)[1]','nvarchar(100)')  + '.' +  EVENTDATA().value('(/EVENT_INSTANCE/ObjectName)[1]','nvarchar(100)');
Declare k cursor For Select distinct 'sp_refreshview ''' + o.name + '''' sql
    From sys.objects o Join sys.sql_expression_dependencies s On o.object_id = s.referencing_id   
    Where o.type = 'V' AND s.referenced_id = Object_id(@tname);  
Open k
Fetch Next from k into @sql
While @@FETCH_STATUS = 0
Begin
    Print( @sql )
    EXEC( @sql )
    Fetch Next from k into @sql
End
Close k
Deallocate k
Go