暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle中究竟能不能找到执行过的DDL?

1587

最近在做SQL规范验证工作的时候,发现一个问题,本想从视图中找到应用执行过的DDL,但是没找到,即使是刚刚跑的,难道数据库不抓这种SQL?

例如,

    SQL> create table temp (id number);
    Table created.

    SQL> select * from v$sqlarea where upper(sql_text) like 'CREATE%';
    no rows selected
    复制

    于是在OTN上开了个discussion,得到了很多前辈的反馈,尤其是JL大神,之所以称作大神,就是能言简意赅的说明问题,一语中的,这是我们需要学习和积累的,

    https://community.oracle.com/tech/developers/discussion/4486535/ddl-in-v-sql/p1?new=1

    当执行DDL时,他会转换成一系列的DML,操作各种数据字典表,我们从10046能看到这些具体的操作,例如create table,他会向tab$、col$等视图,插入一些元数据,

    按照JL说的,DDL在v$sql中通常是不可见的,因为这些语句不需要共享,只当一些并行创建的场景,并行执行的处理器才会需要操作相同的对象。但是这些DDL语句有可能会在x$kglob(内部库对象结构)中找到,需要使用SYS或者通过SYS创建一个视图并授权给指定用户来访问,

    JL用了个俚语,hit-and-miss,再结合下面例子,说明确实不同的DDL语句现象可能都是不同的,

    JL所说的是在19c的数据库中,得到如下结论,

    1. create index,不会展示在v$sql,但是能从x$kglob找到。

    2. alter table add {column},不会展示在v$sql,但是能从x$kglob找到。

    3. create table as select,v$sql和x$kglob都可以找到。

    4. create table(list of columns),v$sql和x$kglob都不会存储。

    5. create materialized view log,不会展示在v$sql,x$kglob会进行存储。

    当然,DDL的语句,不止这些,像truncate,不会展示在v$sql,但是能从x$kglob找到。

    另外,11g中的create table(list of columns)会在x$kglob存储,这个和19c就不太相同的,这可能就是JL所说的hit-and-miss现象,

      SQL> exec print_table('select kglhdadr,kglhdpar,kglnaobj,kglfnobj from x$kglob where kglnaobj like ''%test2%''');
      KGLHDADR : 0000000422FF5BF8
      KGLHDPAR : 00000003E2B84408
      KGLNAOBJ : create table test2 a
      KGLFNOBJ : create table test2 a
      -----------------
      PL/SQL procedure successfully completed.
      复制

      近期更新的文章:

      最近碰到的几个问题

      小白学习MySQL - InnoDB支持optimize table?

      拼接字符串SQL需求

      2021雷军年度演讲 - 我的梦想,我的选择

      梅西 ≠ 一人一城?


      文章分类和索引:

      《公众号800篇文章分类和索引

      文章转载自bisal的个人杂货铺,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

      评论