一.问题描述
当对视图使用的基表进行表结构修改后,会触发视图的无效以及编译出错问题,必须重建视图解决。
二.问题再现
1.Oracle10g环境
1.1 创建视图测试用两张基表:TestTable和TestUser
1.2 创建测试视图VW_TABLEUSERALL和VW_TABLEUSER
前者使用了TestTable.*, 后者显示指定列。
查询视图的状态如下:全部是Valid状态
1.3 修改TestTable表结构:增加一列Col1
再次查询视图的状态如下:全部是INVALID状态
1.4 重新编译两张视图
重新查询视图的状态如下:全部是Valid状态:
查询视图的数据:VW_TableUserAll查询出错。
1.5 视图重建
重新查询视图的数据:VW_TableUserAll查询正常: 新增的Col1出现了!
2. Oracle11g环境
2.1 环境准备
和Orale10g下的1.1 和1.2 步骤一致
2.2 修改TestTable表结构:增加一列Col1
查询视图的状态如下:全部是VALID状态
2.3 查询视图VW_TableUserAll,没有新增的Col1这一列!
但是基表TestTable中存在Col1这一列
2.4 重新编译视图,依旧查不到Col1这一列
2.5 重建视图,问题解决
3. 问题结论
Oracle10g环境下:
对视图基表的修改会触发view的无效。如果视图中使用了修改的基表表结构,重新编译视图无法解决问题,视图需要重建。
Oracle11g环境下:
对视图基表的修改不会触发view的无效。如果视图中使用了修改的基表表结构,重新编译视图无法解决问题,视图需要重建。
因此:
如果修改了视图使用到的基表的表结构被修改了,恰如视图中涉及了修改后的表结构,重新编译视图操作,仍无法查询到修改的列,必须进行视图重建。