相当于oracle中的sp_refreshview

相当于oracle中的sp_refreshview,oracle,plsql,Oracle,Plsql,Oracle在SQL Server上是否有类似sp_refreshview的功能 提前感谢,, 据我所知,戈兰。我通常只看到数据库中保存的扩展表单中的select*等视图。我认为,除了修改视图之外,您不可能向基础表中添加一列并将该列放入视图中 对于ORACLE用户,这里的示例介绍了如何使用SQL Server(自SQL2008起),但未修改的定义也存储在sysbase时代的syscomments中: 警告这是T-SQL create table t1 (i int, c1 int); creat

Oracle在SQL Server上是否有类似sp_refreshview的功能

提前感谢,,
据我所知,戈兰。我通常只看到数据库中保存的扩展表单中的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没有存储定义,因此无法刷新视图

据我所知,没有。我通常只看到数据库中保存的扩展表单中的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没有存储定义,因此无法刷新视图

在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仍会尝试执行该视图,即使它知道该视图被标记为无效:

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 (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.
希望这有帮助

问候,,
Rob.

在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仍会尝试执行该视图,即使它知道该视图被标记为无效:

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 (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.
希望这有帮助

问候,,
罗布。

不同意。这是必要的。这就是开始视图的问题所在。可以向基础表中添加列。视图保持有效,但不包括新列。这就是为什么我们的支持率很高的原因。我不认为在视图中使用*是一个特别好的主意。您可能会得到一些您不想看到的东西。@bernd_k:如果您向表中添加了一列,并且希望该列也包含在视图中,那么您应该在视图中显式地包含新列。我还认为视图定义的“select*”不是一个好主意。它可能会导致意外的副作用。这里我们讨论的不是最佳做法,而是MS SQLServer支持但ORACLE不支持的功能。+1,尽管OP问题的简短回答是:“alter view v compile”不同意。这是必要的。这就是开始视图的问题所在。可以向基础表中添加列。视图保持有效,但不包括新列。这就是为什么我们的支持率很高的原因。我不认为在视图中使用*是一个特别好的主意。您可能会得到一些您不想看到的东西。@bernd_k:如果您向表中添加了一列,并且希望该列也包含在视图中,那么您应该在视图中显式地包含新列。我还认为视图定义的“select*”不是一个好主意。它可能会导致意外的副作用。这里我们讨论的不是最佳做法,而是MS SQLServer支持但ORACLE不支持的功能。+1,尽管OP问题的简短回答是:“alter view v compile”