背景:测试环境有表若干,产品环境有表若干。客户发信要求把产品环境数据同步到测试环境并提供了需要同步的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);