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

简介: 在平时的工作环境中,总会有一些表会存在依赖关系,比如我们有三张表customer,用户表subscriber,账户表account 其中客户可以有多个用户或者账户,subscriber表和account表中就存在外键customer_id指向了customer表。
在平时的工作环境中,总会有一些表会存在依赖关系,比如我们有三张表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级了,这些如果人工来一个一个审核,确实是很头疼的工作。
目录
相关文章
|
Linux Shell C语言
【Shell 命令集合 设备管理 】Linux 设置键盘映射表 loadkeys命令 使用指南
【Shell 命令集合 设备管理 】Linux 设置键盘映射表 loadkeys命令 使用指南
277 0
|
监控 Shell Linux
【Shell 命令集合 网络通讯 】Linux 分析串口的状态 statserial命令 使用指南
【Shell 命令集合 网络通讯 】Linux 分析串口的状态 statserial命令 使用指南
291 0
|
存储 算法 Shell
【Shell 命令集合 设备管理 】Linux 显示当前系统中定义的键盘映射表 dumpkeys命令 使用指南
【Shell 命令集合 设备管理 】Linux 显示当前系统中定义的键盘映射表 dumpkeys命令 使用指南
173 0
|
应用服务中间件 Shell nginx
shell分析nginx日志的一些指令
shell分析nginx日志的一些指令
166 0
|
消息中间件 Kafka Shell
Linux【脚本 02】shell脚本离线安装配置Zookeeper及Kafka并添加service服务和开机启动(脚本分析)
Linux【脚本 02】shell脚本离线安装配置Zookeeper及Kafka并添加service服务和开机启动(脚本分析)
218 0
|
存储 Java Shell
分布式数据库HBase的常用操作的基本Shell命令的表操作
HBase是一个分布式数据库系统,支持高性能、可伸缩、实时的数据存储和处理。在HBase中,我们可以使用Shell命令来进行常用的操作,如创建表、插入数据、查询数据、更新数据等。本文将介绍关于分布式数据库HBase的常用操作基本Shell命令的表操作。
523 0
|
监控 网络协议 搜索推荐
分析服务器日志Shell 命令集锦,收藏好了~
分析服务器日志Shell 命令集锦,收藏好了~
354 0
|
SQL 前端开发 关系型数据库
《懒人Shell脚本》之八——定期备份Mysql数据库表的实现
0.背景 实际开发环境中,前端程序需要在给定时间段内,将数据更新/插入到mysql指定的库表中。随着数据量的增多,基础库表基数的增长,每更新一次都会有5s左右的卡顿。
|
Shell Linux Python
实例分析:Linux 系统 CentOS8 shell 中 set, env, export 区别与使用场景
set , env 和 export 之间的异同,以及使用场景
931 0
|
Shell Linux
实例分析 centos8 shell 命令与变量
centos 8 shell 类型; shell 变量; 变量定义与修改; 全局变量与局部变量
503 0