通过shell分析表依赖的层级关系

在平时的工作环境中,总会有一些表会存在依赖关系,比如我们有三张表customer,用户表subscriber,账户表account
其中客户可以有多个用户或者账户,subscriber表和account表中就存在外键customer_id指向了customer表。
这种情况下表的依赖关系就如下所示:
customer
            subscriber
            account
如果表中的层级关系更为复杂,如果能够得到一个很清晰的依赖关系表。在做一些重要的操作时就能运筹帷幄。避免很多不必要的麻烦。
今天开发的人员私信给我,想让我帮忙在测试环境运行一些脚本,本来这种工作都是需要按照流程的,我们聊了下,他说现在手头有10个左右的脚本,都是些dml相关的操作,每个脚本会对应修改一个表的数据,但是每次执行的时候都会报外键不存在的错误,他想让我来帮忙看看,是哪些表存在依赖关系,这个问题换我来,我也得知道脚本的依赖关系,即涉及到的表的依赖关系,我说我来帮你分析这个关系,还是按照流程来运行你的脚本吧,他半信半疑,我就运行了下面的脚本,得到了一个依赖关系列表。

使用shell脚本分析表依赖的层级关系脚本如下:

sqlplus -s $DB_CONN_STR@$SH_DB_SID
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,'
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
----- -------------------------------------------------- ......

2-    -----||DE_CRI_ALLOWED_OPS(2)

2-    -----||DE_CRI_ITEMS(2)

3-    --------||DE_CRI_CONNECTIONS(3)

3-    --------||DE_CRI_POOL(3)

4-    -----------||DE_CONDITIONS(4)

5-    --------------||DE_DP_COMPONENTS(5)

6-   
-----------------||DE_CONTRIBUTE_LIST(6)

6-    -----------------||DE_EXTRA_DPC_FIELDS(6)

6-    -----------------||DE_TIERS(6)

7-    --------------------||DE_STEPS(7)

可以很清晰的看到显示的层级关系,有1,2,3,4  其中1是根节点,2,3,4是依赖表,4依赖3,3依赖2,依此类推。运行脚本的时候是从第1级开始,逐次类推。
可以看到有些表的依赖都到第7级了,这些如果人工来一个一个审核,确实是很头疼的工作。

时间: 2024-09-04 21:00:30

通过shell分析表依赖的层级关系的相关文章

如何利用SQL Server With As递归获取层级关系数据

WITH AS的含义 WITH AS短语,也叫做子查询部分(subquery factoring),可以让你做很多事情,定义一个SQL片断,该SQL片断会 被整个SQL语句所用到.有的时候,是为了让SQL语句的可读性更高些,也有可能是在UNION ALL的不同部分,作为提供数 据的部分. 特别对于UNION ALL比较有用.因为UNION ALL的每个部分可能相同,但是如果每个部分都去执行一遍的话,则成本太高, 所以可以使用WITH AS短语,则只要执行一遍即可.如果WITH AS短语所定义的表

从阿里浪看大数据的层级关系

4月30日晚,友人突然从微信发来消息:"阿里5.86亿美元入股新浪微博18%,微博有戏,新浪股价快速上涨." 哦,是从微信传这个消息的哦. 这个消息其实传了一二年了.没什么大惊小怪.除非你很自恋地认为自己是预言家.而最近新浪微博弄橱窗广告的动向其实就透露出,步子近了. 凑巧的是,我们杂志的微信狂飙突进过了一个新的5位数大关.为了庆祝这一刻,我们做了一个设计.我们这期封面报道是关于乐高这家玩具公司的.我们先打印下来我们的微信二维码,然后用乐高积木拼出来这个二维码的所有细节,拍摄下来,然后

源代码分析-如何利用Eclpise中的AST分析源代码中包类关系。

问题描述 如何利用Eclpise中的AST分析源代码中包类关系. 基于AST去分析源代码中包类的依赖关系,并用一定的图像去显示出来.怎么去实现这个过程...并且显示的方法最合适的应该用什么.

[20120829]分析表与no_invalidate=AUTO_INVALIDATE.txt

[20120829]分析表与no_invalidate=AUTO_INVALIDATE.txt 以前写过一篇blog. 在分析表的是否有一个参数no_invalidate:缺省值是DBMS_STATS.AUTO_INVALIDATE.         10g中默认是AUTO_INVALIDATE,就是说分析表后,游标不会马上invalidate,已经存在的SQL的执行计划不会受新的统计信息影响.可以手工DDL invalidate游标.又或者等待隐藏参数_optimizer_invalidati

web设计-web页面展示-层级关系

问题描述 web页面展示-层级关系 在web页面除了树形结构.还有什么结构可以展现层级关系,现在主流是什么? 解决方案 其实比起树结构,我觉得用图结构来描述web页面更为合适~只要都是对链表数据结构的具体使用.当然,图结构中还可以用邻接矩阵存储节点关系~ 解决方案二: 最典型的也就是图结了

DBMS_STATS的分析表与备份分析信息

在使用DBMS_STATS分析表的时候,我们经常要保存之前的分析,以防分析后导致系统性能低下然后进行快速恢复. 首先创建一个分析表,该表是用来保存之前的分析值: SQL> begin 2 dbms_stats.create_stat_table(ownname => 'TEST',stattab => 'STAT_TABLE'); 3 end; 4 / PL/SQL 过程已成功完成. 分析表信息 SQL> BEGIN 2 --DBMS_STATS.delete_table_stat

Oracle中如何分析表和动态采样

之前在说Oracle Optimizer中的CBO时讲到,当表没有做分析的时候,Oracle 会使用动态采样来收集统计信息. 获取准确的段对象(表,表分区,索引等)的分析数据,是CBO存在的基石,CBO的机制就是收集尽可能多的对象信息和系统信息,通过对这些信息进行计算,分析,评估,最终得出一个成本最低的执行计划. 所以对于CBO,数据段的分析就非常重要. 1.先演示一个示例,来理解分析的作用 (1)创建表 SQL> create table t as select object_id,objec

用WPS表格打造方便查询的成绩分析表

每次考试结束之后,都需要统计各班级学生的学习情况,如各班各学科的总分.平均分.及格率.优秀率等.一份包罗万象的全面的表格固然不错,但不够直观方便.最好能打造一份可以方便查询的表格,并且查询的结果还能用图表的形式实时显示. 用WPS的表格工具,我们就可以实现这一目的. 图1所示为某份原始成绩表,包括全年级八个班八个学科的成绩.这份表格放在"原始数据"工作表中.现在我们需要方便地查询各个班各学科的总分.平均分.及格率.优秀率四个项目. 图1 原始成绩表 一.基本表格准备 在Sheet2工作

WPS成绩分析表表格制作教程

每次考试结束之后,领导都需要了解各班级学生的学习情况,如各班各学科的总分.平均分.及格率.优秀率什么的.如果我们给领导送上一份包罗万象的全面的表格固然不错,但总归是不那么直观方便.如果能打造一份可以方便查询的表格,并且查询的结果还能用图表的形式实时显示,那么效果一定不是一般的好.用WPS的表格工具,我们就可以实现这一目的. ▲图1 图1所示为某份原始成绩表,包括全年级八个班八个学科的成绩.这份表格放在"原始数据"工作表中.我们的任务是能够方便地查询各个班各学科的总分.平均分.及格率.优