我有两个视图,第二个视图取决于第一个视图中的数据,并从不同的表中添加一些列。
在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
更难以阅读和保护。
有没有办法防止这种行为?
由于
答案 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数据库在顶级视图中展开任何通配符(*) 查询列列表。生成的查询存储在数据中 字典;任何子查询都保持不变。列中的列名称 扩展列列表括在引号中以便考虑 基础对象的列最初的可能性 使用引号输入并要求它们在语法上进行查询 正确的。