防止sqldeveloper在视图中扩展asterisc通配符

时间:2018-04-05 17:07:48

标签: oracle oracle-sqldeveloper

我有两个视图,第二个视图取决于第一个视图中的数据,并从不同的表中添加一些列。

在sql developer中,我按如下方式定义视图:

view1:     

select col11, col12, col13, col14, col15, col15, col16, col17 
from table1

view2:
select  view1.*, col22, col23
from view1 join table2 on view1.col11 = table2.col21

但是在保存之后,sqldeveloper扩展了" view1。*"显式列列表的第二个视图的一部分,因此view2最终被重写为:

select  view1.col11, view1.col12, view1.col13, view1.col14, view1.col15, view1.col15, view1.col16, view1.col17, col22, col23
from view1 join table2 on view1.col11 = table2.col21

更难以阅读和保护。

有没有办法防止这种行为?

由于

1 个答案:

答案 0 :(得分:3)

那不是SQL Developer在做 ,它是数据库。

您可以使用*语法创建视图,但数据库将始终将其转换为完全限定的SELECT列表。

CREATE VIEW LOCS
AS select * from locations;

现在向DB询问DDL,你得到

CREATE OR REPLACE FORCE EDITIONABLE VIEW "HR"."LOCS" (
    "LOCATION_ID",
    "STREET_ADDRESS",
    "POSTAL_CODE",
    "CITY",
    "STATE_PROVINCE",
    "COUNTRY_ID"
) AS
    SELECT
        "LOCATION_ID",
        "STREET_ADDRESS",
        "POSTAL_CODE",
        "CITY",
        "STATE_PROVINCE",
        "COUNTRY_ID"
    FROM
        locations;

视图是在运行时定义的,它将获取现有列列表,并假设您希望在视图中使用相同的列名称,这些列名称是从中拉出这些列的基础对象。

来自Docs -

  

在视图创建时扩展定义查询当视图为时   创建后,Oracle数据库在顶级视图中展开任何通配符(*)   查询列列表。生成的查询存储在数据中   字典;任何子查询都保持不变。列中的列名称   扩展列列表括在引号中以便考虑   基础对象的列最初的可能性   使用引号输入并要求它们在语法上进行查询   正确的。