我正在创建这样的Oracle视图:
SELECT * FROM TABLE;
Run Code Online (Sandbox Code Playgroud)
当我创建视图时,我注意到oracle将视图查询更改为:
SELECT FIELD1, FIELD2,... FROM TABLE;
Run Code Online (Sandbox Code Playgroud)
我的问题是,如果我更改TABLE结构,例如添加一个新字段,则视图中不会考虑更改.然后,我必须重新创建视图,并将此视图的regrant特权授予用户/角色.
是否有任何方法可以使视图模式通用并将其保持为以下形式:SELECT*FROM TABLE?
谢谢.
在*创建视图时评估,而不是在执行视图时评估.事实上,Oracle编译视图以加快执行速度.它在引用视图时使用已编译的代码.它不仅仅是对查询进行文本替换.
更改视图的正确语法是:
create or replace view v_table as
select *
from table;
Run Code Online (Sandbox Code Playgroud)
您无法定义在基础表更改时自动更改其结构的简单视图.添加新列时,您需要触摸视图.您几乎肯定需要像@GordonLinoff所建议的那样做,并CREATE OR REPLACE在表格更改时执行.鉴于对表的更改应该是罕见的并且应该涉及适当的更改控制,因此触摸视图作为更改的一部分应该是相对简单的步骤.
如果您真的决心避免触及视图,那么有一些替代方案.我通常不会推荐这些,因为它们很可能会增加而不是降低维护系统的复杂性.但是如果你有第三方系统正在生成DDL以在不可预测的基础上添加列,那么它可能是有意义的.
您可以创建一个DDL触发器,该触发器响应于ALTER表和使用dbms_job该表重新创建视图的作业的语句而触发.这是相当多的移动件,但它通常是可行的.
或者,您可以创建一个返回可变数量列的管道化表函数,而不是视图.这将是非常复杂的,但它也很漂亮.我觉得使用这种方法的地方并不多,因为没有多少人可以查看该代码并有机会维护它.但代码很漂亮.
| 归档时间: |
|
| 查看次数: |
99 次 |
| 最近记录: |