相当于oracle中的sp_refreshview

Oracle是否在SQL Server上有类似sp_refreshview的东西? 提前致谢, 戈兰     
已邀请:
在Oracle中有一个等价物,但没有必要使用它。这是一个例子: 一张桌子:
SQL> create table t (id,name)
  2  as
  3  select 1, 'StackOverflow' from dual
  4  /

Table created.
一个看法:
SQL> create view v
  2  as
  3  select id
  4       , name
  5    from t
  6  /

View created.
哪个有效:
SQL> select *
  2    from v
  3  /

        ID NAME
---------- -------------
         1 StackOverflow

1 row selected.

SQL> select status
  2    from user_objects
  3   where object_name = 'V'
  4  /

STATUS
-------
VALID

1 row selected.
现在对底层表做一些事情:
SQL> alter table t add (description varchar2(100))
  2  /

Table altered.
由于Oracle存储依赖项(请参阅DBA / ALL / USER_DEPENDENCIES视图),因此视图被标记为无效:
SQL> select status
  2    from user_objects
  3   where object_name = 'V'
  4  /

STATUS
-------
INVALID

1 row selected.
但你仍然可以从中进行选择。 Oracle无论如何都会尝试执行它,即使它知道视图标记为INVALID:
SQL> select *
  2    from v
  3  /

        ID NAME
---------- -------------
         1 StackOverflow

1 row selected.
通过从视图中进行选择,它再次标记了视图VALID:
SQL> select status
  2    from user_objects
  3   where object_name = 'V'
  4  /

STATUS
-------
VALID

1 row selected.
您还可以编译视图,以确保视图提前有效:
SQL> alter table t add (description2 varchar2(100))
  2  /

Table altered.

SQL> select status
  2    from user_objects
  3   where object_name = 'V'
  4  /

STATUS
-------
INVALID

1 row selected.

SQL> alter view v compile
  2  /

View altered.
“编译”视图将其标记为有效:
SQL> select status
  2    from user_objects
  3   where object_name = 'V'
  4  /

STATUS
-------
VALID

1 row selected.
如果更改影响视图,则基础查询不再执行:
SQL> alter table t drop column name
  2  /

Table altered.

SQL> select status
  2    from user_objects
  3   where object_name = 'V'
  4  /

STATUS
-------
INVALID

1 row selected.
然后你会得到一个运行时错误:
SQL> select *
  2    from v
  3  /
  from v
       *
ERROR at line 2:
ORA-04063: view "OWNER.V" has errors


SQL> select status
  2    from user_objects
  3   where object_name = 'V'
  4  /

STATUS
-------
INVALID

1 row selected.
希望这可以帮助。 问候, 抢。     
据我所知不是。我通常只从数据库中保存的扩展表单中查看select *之类的视图。我认为您不可能将列添加到基础表并将此列放入视图而不是更改视图。 对于ORACLE用户,可以使用SQL-Server(自SQL2008)以来的示例,但未修改的定义也存储在sysbase中的syscomments中: 警告这是T-SQL
create table t1 (i int, c1 int);
create view v1 as select * from t1;
alter table t1 add c2 int;
select * from v1;   -- c2 is not present here
sp_refreshview v1;
select * from v1;   -- c2 is present here 
我想由于Oracle不存储定义,因此无法刷新视图。     

要回复问题请先登录注册