2010-12-17 56 views

回答

2

据我所知没有。而且我通常会看到只有保存在数据库中的展开表单中的select *。我认为你不可能将一列添加到一个底层表中,并将这个列添加到视图中,而不是改变视图。

对于这里的ORACLE用户您可以使用SQL-服务器(因为SQL2008),但未经修改的定义做例子是存储在syscomments中的SYSBASE时间以及:

警告,这是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不存储定义,它不能刷新视图。

3

在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. 

如果变化影响,使得基础查询不能再执行view:

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. 

希望这有助于。

Regards, Rob。

+0

不同意。这是必要的。这是启动视图的问题。您将列添加到基础表。视图保持有效,但不包括新列。这是我们支持的原因之一。 – 2010-12-17 14:49:33

+5

我不认为在视图中使用*是一个特别好的主意。你可能最终会在那里发现你并不想要的东西。 – JOTN 2010-12-17 15:25:02

+1

@bernd_k:如果你添加一列到你想要包含在视图中的表中,那么你应该在视图中明确包含新列。我也认为“选择*”视图定义不是一个好主意。它可能会导致意想不到的副作用。 – 2010-12-17 15:32:21