当我尝试查看 Oracle sql Developer 视图的源代码时,我遇到了一个奇怪的情况,Oracle sql Developer 重新编译了该视图,下面的命令以某种方式被解雇,而我实际上并没有解雇它
“更改视图 view_name 编译”
请指导我在使用 Oracle SQL Developer 时如何避免这种副作用
查看视图的源代码,
获取 VIEW 的 DDL 时不会执行“ALTER”或“COMPILE”语句。
这正是 SQL Developer 在请求代表您的视图(SQL 页面)的 DDL 时发送到数据库的内容
设置会话以从 DBMS_METADATA 获取 DDL,这些取决于您设置导出外观的首选项。
declare
function ifelse (
bool_in in number
) return boolean is
begin
if bool_in = 0 then
return false;
else
return true;
end if;
end;
begin
dbms_metadata.set_transform_param(
dbms_metadata.session_transform,
'SEGMENT_ATTRIBUTES',
ifelse(:segments)
);
dbms_metadata.set_transform_param(
dbms_metadata.session_transform,
'PARTITIONING',
ifelse(:partitioning)
);
dbms_metadata.set_transform_param(
dbms_metadata.session_transform,
'TABLESPACE',
ifelse(:tablespace)
);
dbms_metadata.set_transform_param(
dbms_metadata.session_transform,
'SQLTERMINATOR',
ifelse(:terminator)
);
dbms_metadata.set_transform_param(
dbms_metadata.session_transform,
'PRETTY',
ifelse(:pretty)
);
dbms_metadata.set_transform_param(
dbms_metadata.session_transform,
'SIZE_BYTE_KEYWORD',
ifelse(:byte)
);
dbms_metadata.set_transform_param(
dbms_metadata.session_transform,
'FORCE',
ifelse(:force)
);
dbms_metadata.set_transform_param(
dbms_metadata.session_transform,
'CONSTRAINTS_AS_ALTER',
ifelse(:alter)
);
dbms_metadata.set_transform_param(
dbms_metadata.session_transform,
'EMIT_SCHEMA',
ifelse(:showschema)
);
dbms_metadata.set_transform_param(
dbms_metadata.session_transform,
'CONSTRAINTS',
ifelse(:constraint)
);
dbms_metadata.set_transform_param(
dbms_metadata.session_transform,
'REF_CONSTRAINTS',
ifelse(:ref_constraint)
);
end;
获取视图的 DDL 以及关联的任何评论或触发器
select dbms_metadata.get_ddl(
'VIEW',
:name,
:owner
)
from dual
union all
select dbms_metadata.get_ddl(
'TRIGGER',
trigger_name,
owner
)
from dba_triggers
where table_owner = :owner
and table_name = :name
union all
select dbms_metadata.get_dependent_ddl(
'COMMENT',
table_name,
owner
)
from (
select table_name,
owner
from dba_col_comments
where owner = :owner
and table_name = :name
and comments is not null
union
select table_name,
owner
from sys.dba_tab_comments
where owner = :owner
and table_name = :name
and comments is not null
)
获取任何外键约束(是的,视图可以有这些!)
declare
function ifelse (
bool_in in number
) return boolean is
begin
if bool_in = 0 then
return false;
else
return true;
end if;
end;
begin
dbms_metadata.set_transform_param(
dbms_metadata.session_transform,
'SEGMENT_ATTRIBUTES',
ifelse(:segments)
);
dbms_metadata.set_transform_param(
dbms_metadata.session_transform,
'PARTITIONING',
ifelse(:partitioning)
);
dbms_metadata.set_transform_param(
dbms_metadata.session_transform,
'TABLESPACE',
ifelse(:tablespace)
);
dbms_metadata.set_transform_param(
dbms_metadata.session_transform,
'SQLTERMINATOR',
ifelse(:terminator)
);
dbms_metadata.set_transform_param(
dbms_metadata.session_transform,
'PRETTY',
ifelse(:pretty)
);
dbms_metadata.set_transform_param(
dbms_metadata.session_transform,
'SIZE_BYTE_KEYWORD',
ifelse(:byte)
);
dbms_metadata.set_transform_param(
dbms_metadata.session_transform,
'FORCE',
ifelse(:force)
);
dbms_metadata.set_transform_param(
dbms_metadata.session_transform,
'EMIT_SCHEMA',
ifelse(:showschema)
);
dbms_metadata.set_transform_param(
dbms_metadata.session_transform,
'CONSTRAINTS',
ifelse(:constraint)
);
dbms_metadata.set_transform_param(
dbms_metadata.session_transform,
'REF_CONSTRAINTS',
ifelse(:ref_constraint)
);
dbms_metadata.set_transform_param(
dbms_metadata.session_transform,
'CONSTRAINTS_AS_ALTER',
false
);
end;
为上述观点获得任何资助
select dbms_metadata.get_dependent_ddl(
'OBJECT_GRANT',
:name,
:owner,
:version
)
from dual
where 0 != (
select count(*)
from dba_col_privs
where owner = :owner
and table_name = :name
) + (
select count(*)
from dba_tab_privs
where owner = :owner
and table_name = :name
)
就是这样 - 没有发送 CREATE、REPLACE 或 COMPILE。
当然,你不必相信我,检查日志面板,我们将向你展示所有通过 JDBC 驱动程序发送到数据库的语句。
当然,您不必信任应用程序,执行数据库会话跟踪,您就可以看到为 SQL Developer 会话执行的所有内容。