如何在VIEW输出子句中保留"*",以便列跟踪表的更改?

Tho*_*ton 3 sql oracle

我正在创建这样的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?

谢谢.

Gor*_*off 6

*创建视图时评估,而不是在执行视图时评估.事实上,Oracle编译视图以加快执行速度.它在引用视图时使用已编译的代码.它不仅仅是对查询进行文本替换.

更改视图的正确语法是:

create or replace view v_table as
    select *
    from table;
Run Code Online (Sandbox Code Playgroud)

  • @ThomasCarlton...我不认为您可以告诉Oracle在基础表更改结构时自动重新编译视图.相反,Oracle使它们无效.但是,您可以只执行相同的`create或replace`代码来重新创建视图(或`alter view compile`. (2认同)

Jus*_*ave 6

您无法定义在基础表更改时自动更改其结构的简单视图.添加新列时,您需要触摸视图.您几乎肯定需要像@GordonLinoff所建议的那样做,并CREATE OR REPLACE在表格更改时执行.鉴于对表的更改应该是罕见的并且应该涉及适当的更改控制,因此触摸视图作为更改的一部分应该是相对简单的步骤.

如果您真的决心避免触及视图,那么有一些替代方案.我通常不会推荐这些,因为它们很可能会增加而不是降低维护系统的复杂性.但是如果你有第三方系统正在生成DDL以在不可预测的基础上添加列,那么它可能是有意义的.

您可以创建一个DDL触发器,该触发器响应于ALTER表和使用dbms_job该表重新创建视图的作业的语句而触发.这是相当多的移动件,但它通常是可行的.

或者,您可以创建一个返回可变数量列的管道化表函数,而不是视图.这将是非常复杂的,但它也很漂亮.我觉得使用这种方法的地方并不多,因为没有多少人可以查看该代码并有机会维护它.但代码很漂亮.