Oracle中究竟能不能找到执行过的DDL?
Posted bisal
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle中究竟能不能找到执行过的DDL?相关的知识,希望对你有一定的参考价值。
最近在做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?》
文章分类和索引:
以上是关于Oracle中究竟能不能找到执行过的DDL?的主要内容,如果未能解决你的问题,请参考以下文章