通过shell分析表依赖的层级关系(r3笔记第97天)

在平时的工作环境中,总会有一些表会存在依赖关系,比如我们有三张表customer,用户表subscriber,账户表account 其中客户可以有多个用户或者账户,subscriber表和account表中就存在外键customer_id指向了customer表。 这种情况下表的依赖关系就如下所示: customer subscriber account 如果表中的层级关系更为复杂,如果能够得到一个很清晰的依赖关系表。在做一些重要的操作时就能运筹帷幄。避免很多不必要的麻烦。 使用shell脚本分析表依赖的层级关系脚本如下:

sqlplus -s $DB_CONN_STR@$SH_DB_SID <<EOF
set pages 1000
set echo off
set feedback off
create  table table_depency_rel as
(
select   
          p.table_name  parent_table_name ,   
          p.owner p_owner,  
          c.table_name  child_table_name ,  
          c.owner c_owner  
     from  user_constraints p, user_constraints c  
    where p.constraint_type IN  ('P','U') AND  
          c.constraint_type = 'R' AND  
           p.constraint_name = c.r_constraint_name
          group by  p.table_name,p.owner, c.table_name, c.owner
)
;
--alter table  table_depency_rel modify(p_owner null);
alter table table_depency_rel  modify(parent_table_name null);
insert into table_depency_rel 
(
select  null,null,parent_table_name,p_owner from table_depency_rel 
where  parent_table_name not in (select child_table_name from table_depency_rel group  by child_table_name)group by parent_table_name,p_owner 
);
set echo  on
set feedback on
col table_node format a50
col level_code format  a5
select decode(level,1,'<--'||level,level)||'-' level_code ,  lpad('-',level*3-1,'--')||'||'||t.child_table_name||'('||level||')' table_node  from table_depency_rel t
connect by prior t.child_table_name   =t.parent_table_name 
start with t.child_table_name in(select  child_table_name from table_depency_rel where parent_table_name is null group by  child_table_name)
--order by parent_table_name desc;
set feedback off
set echo off
drop table table_depency_rel;
EOF
exit

自己在反复模拟一些场景之后总结了如上的脚本。 我们来通过如下的方式运行脚本,查看system下的表依赖关系。

ksh  showdepency.sh

LEVEL TABLE_NODE
-----  --------------------------------------------------
<--1-  --||AQ$_INTERNET_AGENTS(1)
2-     -----||AQ$_INTERNET_AGENT_PRIVS(2)
<--1- --||DEF$_DESTINATION(1)
2-     -----||DEF$_CALLDEST(2)
2-    -----||REPCAT$_REPSCHEMA(2)
<--1-  --||MVIEW$_ADV_LOG(1)
2-    -----||MVIEW$_ADV_AJG(2)
3-     --------||MVIEW$_ADV_FJG(3)
4-     -----------||MVIEW$_ADV_GC(4)
......

可以很清晰的看到显示的层级关系,有1,2,3,4 其中1是根节点,2,3,4是依赖表,4依赖3,3依赖2,依此类推。

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2014-12-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Jed的技术阶梯

利用Sqoop实现Hbase的数据与MySQL数据的互导

在服务器(主机名为repo)的mysql数据库中的"test"库中有一张"student"表,其中内容如下:

43730
来自专栏漏斗社区

少年,这是我特意为你酿制的Oracle 注入,干了吧!

最近遇到Oracle注入的测试越来越多,而且互联网上oracle注入的总结较为少见,为了能够快速的进行漏洞测试和挖掘,诞生了想要把之前学习的Oracle注入方式...

438100
来自专栏程序小工

windows7使用Sphinx+PHP+MySQL详细介绍

由于业务需要,需要做类似淘宝商城商品检索的功能,对于数据量很大的情况,MySQL 查询的效率损耗很大,需要使用专门的索引引擎进行搜索查询,实现功能,对于和 PH...

52710
来自专栏杨建荣的学习笔记

一条关于swap争用的报警邮件分析(一)(r7笔记第28天)

最近这些天有一台服务器总是会收到剩余swap过低的告警。 邮件内容大体如下: ############ ZABBIX-监控系统: --------------...

38040
来自专栏杨建荣的学习笔记

dataguard备库的数据文件的迁移实战(r8笔记第24天)

在前几天也花了一点时间测试了一下关于备库数据文件的迁移,这部分的工作看起来还是比较常规的,当然方法也很多。但是在实际工作中就更不能掉以轻心,所有 的操作都要有理...

360110
来自专栏技术翻译

关于Couchbase-Dzone数据库,你必须了解的10件事情

此功能已经存在了一段时间,但仍值得一提。一些Key-Value Store只允许你将整个文档全部整合在一起,这是一个合理的。但是,如果你使用Couchbase作...

28100
来自专栏郭耀华‘s Blog

LitePal——Android数据库框架完整使用手册

LitePal for Android LitePal是一个开源的Android库,使开发人员使用SQLite数据库非常简单。您无需编写任何SQL语句就可以完...

38670
来自专栏python3

django操作非ORM创建的表

工作中会遇见很多二次开发的时候,表都是已经创建好的,用django的ORM进行二次开发,怎么操作数据库中的表呢?

18020
来自专栏张戈的专栏

常用MySQL语句搜集整理

折腾 WordPress 多少要接触到 MySQL 的一些操作,比如,玛思阁之前重装 postview 插件后发现所有的 view 数据都被清空了!只好到 ph...

40450
来自专栏杨建荣的学习笔记

database replay基础学习(r4笔记第90天)

在11g中,database replay是一个很重要的新特性,按照这个特性的说法,可以完整地捕获数据库的负载信息,便于在需要的时候随时重放。 使用这种方法,可...

38480

扫码关注云+社区

领取腾讯云代金券