重新编译视图后,视图上的从属对象不会失效

时间:2017-12-29 17:26:30

标签: object view oracle11g dependencies schema

根据doc重新编译视图(如下所示)修改列列表。插入到相应表中的依赖对象refvirew_intab应该变为invalid。但我发现refvirew_intab恰好仍然是valid。我错过了doc的任何内容。

创建视图vextest

create or replace VIEW vextest as (select num1,num2 from test);

refvirew_intab上创建依赖对象vextest,它试图插入表测试(不指定列列表):

Create or replace procedure refvirew_intab is
num_var number;
begin
select num1 into num_var from vextest;
insert into test values(31,25);
end;
/

重新编译视图vextest

create or replace VIEW vextest as (select num1 from test);

如果你想提出一个不同的逻辑/声明,我感激不尽,结果证明是valid。但如果你能指出我与文档的不同之处,那么我会得到不同的结果,这将非常有用。

1 个答案:

答案 0 :(得分:0)

the doc you linked to,在#34; CREATE OR REPLACE VIEW view"下,它显示了"从属对象的结果状态"是:

  

INVALID当新旧定义的列列表不同时,至少满足下列条件之一:

     
      
  • 在新视图或表定义中修改或删除的从属对象引用列。
  •   
  • 从属对象使用view%rowtypetable%rowtype
  •   
  • 从属对象在视图或表上执行INSERT而不指定列列表。
  •   
  • 新视图定义在包含SQL连接的查询中引入新列和依赖对象引用视图或表。
  •   
  • 新视图定义在引用PL / SQL变量的查询中引入新列和依赖对象引用视图或表。
  •   
  • 从属对象引用RELIES ON子句中的视图或表。
  •   
     

否则,没有变化。

第一个项目符号不适用,因为该过程仅引用了剩余的列,而不是您删除的列(num2)。

从你问题的重点来看,你似乎期望这个条款会影响你:

  
      
  • 从属对象在视图或表上执行INSERT而不指定列列表。
  •   

乍一看"或表"似乎是虚假的,似乎造成了混乱;你对程序中的基础表所做的事情是无关紧要的。其他条款包括"或表"当他们似乎没有意义。但实际上他们确实如此,因为该表的这一部分适用于" CREATE OR REPLACE VIEW view" "在线表格重新定义(DBMS_REDEFINITION)"。

因此,您正在阅读这意味着在视图的基表上没有列列表的插入应该导致依赖过程无效。事实并非如此。它说如果您对test表进行了在线重新定义,那么该过程将失效。

他们是完全不同的场景;文档只是将它们组合在一起,因为影响是相同的。当该列表引用视图时,它是create or replace view的影响;当它引用表时,它是在线表定义的影响。

表示视图基表上的插入(或对基表的任何其他引用)与重新创建视图有任何关联。