大家肯定都知道是dba_dependencies,all_dependencies,user_dependencies这三张表了,至于它们之间的关系,我就不再多说了。
那么如果大家不知道的话,我们能用什么办法来找到答案呢?-------我想sql_trace 可能帮助我们来解决这样的问题。
C:\Users\jykj>sqlplus scott/scott
SQL*Plus: Release 11.2.0.1.0 Production on 星期三 11月 19 19:05:14 2014
Copyright (c) 1982, 2010, Oracle. All rights reserved.
连接到:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> alter session set sql_trace=true;
会话已更改。
SQL> create view t_view_1 as select * from emp;
视图已创建。
SQL> alter session set sql_trace=false;
会话已更改。
SQL>
这样我们就完成了sql_trace 。
我想大家都会找到刚刚的trace文件,如果不知道的话,可以这样,比较的方便,当然可以根据当前的session 的id 找到Pid ,然后再去trace目录里面找到trace 文件。
SQL> select value from v$diag_info where name='Default Trace File'
2 ;
VALUE
--------------------------------------------------------------------------------
d:\app\jykj\diag\rdbms\orcl\orcl\trace\orcl_ora_14952.trc
找到文件后,可以tkprof 一下,注意,不要sys=no,直接的,不要带参数。
我们知道,创建视图是一个DDL的操作,肯定是要修改一些的系统表,那么肯定有insert 的操作,那我们直接在trace文件里面查找insert 。
当然,我找到了一个类似这样的一张表,insert into dependency$(d_obj#,d_timestamp,order#,p_obj#,p_timestamp, property, d_attrs)values (:1,:2,:3,:4,:5,:6, :7);
查询一下,果然是我们要找的表。查询后
SQL> select object_name,object_id from dba_objects where object_name='T_VIEW_1';
OBJECT_NAME OBJECT_ID
-------------------- ----------
T_VIEW_1 79533
SQL> select p_obj# from dependency$ where D_OBJ#='79533';
P_OBJ#
----------
73196
SQL> select object_name,object_id from dba_objects where object_id='73196';
OBJECT_NAME OBJECT_ID
-------------------- ----------
EMP 73196
终于找到了创建视图的依赖表。然后我家大致的想到了可能有这样的一张表dba_dep%,如果,不能够知道这张表,也没用关系,我们可以这样
select * from dictionary where table_name like '%DEPE%'
这样就完成了我所要做的事情了。
我想从这个小事情上面,反映出的是,我们在想了解Oracle在做某些操作的时候,用到了哪些表,就可以用sql_trace 来完成。它不仅仅是用来查看sql 的执行计划和耗费的。
而且我们可以灵活的运用现有的知识,来探索,解决一些我们不知道的事情。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29497510/viewspace-1339401/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29497510/viewspace-1339401/