相当于oracle中的sp_refreshview
Oracle在SQL Server上是否有类似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
据我所知,戈兰。我通常只看到数据库中保存的扩展表单中的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”