oracle SQL Developer 在尝试生成视图源时是否会在内部重新编译视图

问题描述 投票:0回答:1

当我尝试查看 Oracle sql Developer 视图的源代码时,我遇到了一个奇怪的情况,Oracle sql Developer 重新编译了该视图,下面的命令以某种方式被解雇,而我实际上并没有解雇它

“更改视图 view_name 编译”

请指导我在使用 Oracle SQL Developer 时如何避免这种副作用

查看视图的源代码,

oracle oracle-sqldeveloper
1个回答
0
投票

获取 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 会话执行的所有内容。

© www.soinside.com 2019 - 2024. All rights reserved.