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

2015-01-21 12:11:10 · 作者: · 浏览: 2

在平时的工作环境中,总会有一些表会存在依赖关系,比如我们有三张表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,'<--'||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
?----- -------------------------------------------------- ......



<--1- --||DE_CRI_PARAMS(1)


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级了,这些如果人工来一个一个审核,确实是很头疼的工作。