python 导数据脚本

背景:测试环境有表若干,产品环境有表若干。客户发信要求把产品环境数据同步到测试环境并提供了需要同步的table list。

问题:该list可能有如下问题

  • list中的表存在重复
  • list中的表在测试环境不存在
  • list中的表缺少依赖关系,比如parent表不在list中。

解决上述问题:

list中的表在测试环境不存在的问题:

我们先根据客户提供的list,也就是rawlist创建一个外部表

create directory my_dir as '/tmp';
create table raw_list_tab(owner varchar2(40),table_name varchar2(80)) organization external ( type oracle_loader default directory my_dir access parameters( records delimited by newline fields terminated by '.' missing field values are null (owner,table_name))location('rawlist')  );

然后用SQL检测是否存在重复项

SELECT TABLE_NAME FROM (SELECT TABLE_NAME,COUNT(*) COUNT FROM RAW_LIST_TAB    GROUP BY TABLE_NAME) V1 WHERE V1.COUNT>1;

检测list中的所有entry是否在DB中都存在

SELECT TABLE_NAME FROM RAW_LIST_TAB WHERE TABLE_NAME NOT IN (SELECT TABLE_NAME FROM DBA_TABLES WHERE RAW_LIST_TAB.OWNER=DBA_TABLES.OWNER);

检测是否list中所有表的child 都存在

先创建一个试图 check_child 该视图结构如下
SQL> desc check_child
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 OWNER                                     NOT NULL VARCHAR2(30)
 TABLE_NAME                                NOT NULL VARCHAR2(30)
 P_OWNER                                   NOT NULL VARCHAR2(30)
 P_TABLE_NAME                              NOT NULL VARCHAR2(30)
owner 和 table_name是child的owner和name。 p_owner和p_table_name则是parent的owner 和 name。
创建语句如下
select a.owner,a.table_name,b.owner as p_owner, b.table_name as p_table_name from dba_constraints a ,(select b.owner,b.table_name,b.constraint_name from RAW_LIST_TAB a ,dba_constraints b where a.owner=b.owner and a.TABLE_NAME=b.TABLE_NAME and b.CONSTRAINT_TYPE='P') b where a.r_owner = b.owner and a.R_CONSTRAINT_NAME=b.constraint_name order by p_table_name ;

根据该视图结合下面语句可以查出哪些child不在列表中。
SELECT A.OWNER,A.TABLE_NAME FROM  check_child A WHERE A.TABLE_NAME NOT IN (SELECT TABLE_NAME FROM RAW_LIST_TAB WHERE A.OWNER=RAW_LIST_TAB.OWNER);

 

posted on 2013-04-09 18:08  kramer  阅读(307)  评论(0编辑  收藏  举报

导航