数据迁移判断非空约束(r2笔记45天)

作者: admin 分类: 公众号存档            0 次浏览 发布时间: 2014-07-26 23:31

公众号:杨建荣的学习笔记 · 作者:r2笔记45天 · 发布:2014-07-26 23:31:49 · 原文链接

在数据迁移中,经常会碰到null值的问题,比如在源库中,某些列可能是null值,但是在目标库中,却有非空约束。这样在数据的迁移过程中就会发生问题。
为了更好的对数据的非空问题进行判断,我写了如下的脚本来生成检查的脚本,基本的思路就是生成动态sql,类似 select count(1) from xxx where xxx is null,如果输出结果不为0,说明在源库中存在着非空约束的问题。

脚本需要在目标库中生成,然后在源库执行即可,可以在执行的过程中,考虑加入并行等。
因为非空约束的条件在user_constraints中式long类型卡所以不能做字符串拼接等操作,就当做独立的一列来处理。

sqlplus -s n1/n1 <<EOF
set linesize 150
set feedback off
set pages 0
col search_pre format a58
col search_condition format a50
spool not_null_constraint_$1.sql_tmp
select /*+rule*/
‘select count(1) from ‘ || table_name || ‘ where ‘ search_pre,
search_condition, ‘;’
from user_constraints
where table_name =upper( ‘$1’)
and constraint_type = ‘C’
and constraint_name in
(select constraint_name
from user_cons_columns
where table_name = upper(‘$1’)
and column_name in (select column_name
from user_tab_cols
where table_name =upper( ‘$1’)
and nullable = ‘N’));
spool off;

EOF

sed ‘s/ NOT / /g’ not_null_constraint_$1.sql_tmp > not_null_constraint_$1.sql
rm not_null_constraint_$1.sql_tmp
exit

比如对于表T来说,object_id,object_name含有非空约束。
SQL> desc t
Name Null? Type
—————————————– ——– —————————-
ID NUMBER
OBJECT_ID NOT NULL NUMBER
OBJECT_NAME NOT NULL VARCHAR2(30)
OBJECT_TYPE VARCHAR2(19)
CLOB_TEST CLOB

运行脚本后,生成的sql脚本内容如下所示,达到了预期的目标。

select count(1) from T where “OBJECT_NAME” IS NULL ;
select count(1) from T where “OBJECT_ID” IS NULL ;

admin

杨建荣,《Oracle DBA工作笔记》《MySQL DBA工作笔记》作者,dbaplus社群发起人之一,腾讯云TVP,现任竞技世界系统部经理,拥有十多年数据库开发和运维经验,目前专注于开源技术、运维自动化和性能调优

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注