WEB开发网
开发学院数据库DB2 用 AWK 实现 DB2 数据库 Schema 的同步 阅读

用 AWK 实现 DB2 数据库 Schema 的同步

 2007-04-09 22:17:11 来源:WEB开发网   
核心提示: ·数据库人员面试:sql server(WINDOWS平台上强大的数据库平台)常用测试·Oracle(大型网站数据库平台)数据库客户端的安装和配置·PHP连接数据库的方法(3)·Oracle(大型网站数据库平台)数据库网络的安装和配置(1)·用js
    ·数据库人员面试:sql server(WINDOWS平台上强大的数据库平台)常用测试
    ·Oracle(大型网站数据库平台)数据库客户端的安装和配置
    ·PHP连接数据库的方法(3)
    ·Oracle(大型网站数据库平台)数据库网络的安装和配置(1)
    ·用jsp(SUN企业级应用的首选)从数据库中读取图片并显示在网页
    ·[冷枫推荐]:数据库操作,内外联查询
    ·PHP中使用类对数据库进行操作
    ·图解MySQL(和PHP搭配之最佳组合)数据库的安装和操作 (1)
    ·InterBase 数据库函数库
    ·利用外部命令Oralce数据库导入导出

检查完整性的SHELL程序

以下是"CheckIntegrity.sh"的源代码。该程序用于在数据load结束以后,检查数据库的完整性。


#!/usr/bin/sh# 在数据load结束后,检查数据库的完整性# Copyright: SI HITECH 2006# 作    者: 郑靖华# 创建日期: 2006 年 8 月 2 日# 指定数据库名称if [ $# -lt 1 ]thenDBNAME=ccdbelseDBNAME=$1fi# 检查db2move的lst文件if [ ! -r db2move.lst ]thenecho "当前目录下没有db2move的清单文件 [ db2move.lst ],请确保目录正确并再次执行本命令!"exit 1fi# 生成执行完整性检查的SHELL程序awk -F"!" -v_dbname=${DBNAME} 'BEGIN{printf("connect to %s;\n", _dbname);}{printf("set integrity for %s immediate checked;\n", $2);}' db2move.lst > $DBNAME.integrity.sql# 执行检查程序db2 -tvf $DBNAME.integrity.sqlecho "完整性检查完毕,请仔细查看检查结果!"exit 0

所谓外键关联链,是指A表依赖于B表,B表依赖于C表。只有当C表的外键关联检查成功以后,才能检查B表;同样的,只有当B表的外键关联检查成功以后,才能检查A表。即为了检查A表,可能需要多次执行上述SHELL程序。

所谓外键关联环,是指A表直接或者间接依赖于自身(A表)。比如,A表的a1字段依赖于A表的a2字段,同时,A表的a2字段也依赖于A表的a3字段(其中,a1、a2、a3可以相同,也可以不同),这是一个直接关联的环。再如,A表的a1字段依赖于B表的b1字段,同时,B表的b2字段依赖于A表的a2字段(其中,a1和a2、b1和b2可以相同,也可以不同),这是一个间接关联的环。如果存在这样的环,我们必须通过删除其中的某一个或几个依赖来打破这个环,在完整性检查结束以后,再重建那些被临时删除的依赖。

验证完整性的SHELL程序

我们通过查询所有表的记录数,来验证所有表的完整性是否都已经检查成功。以下是"CntDb.sh"的源码。


#!/usr/bin/sh# 在数据load结束后,取得数据库每一个表的记录数# Copyright: SI HITECH 2006# 作    者: 郑靖华# 创建日期: 2006 年 8 月 3 日# 指定数据库名称if [ $# -lt 1 ]thenDBNAME=ccdbelseDBNAME=$1fi# 检查db2move的lst文件if [ ! -r db2move.lst ]thenecho "当前目录下没有db2move的清单文件 [ db2move.lst],请确保目录正确并再次执行本命令!"exit 1fi# 生成执行完整性检查的SHELL程序awk -F"!" -v_dbname=${DBNAME} 'BEGIN{printf("connect to %s;\n", _dbname);}{tbname = $2;gsub("\"", "", tbname);gsub(" ", "", tbname);printf("select count(*) from %s;\n", tbname);}' db2move.lst > $DBNAME.cnt.sql# 执行检查程序db2 -tvf $DBNAME.cnt.sqlecho "完整性检查完毕,请仔细查看检查结果!"exit 0

如果某个表未完成完整性检查,则在执行上述SHELL程序时,会出现下述错误提示:


select count(*) from sampletable1-----------SQL0668N  由于表 "SAMPLETABLE" 上的原因代码 "1",所以不允许操作。SQLSTATE=57016

这个错误代码及原因代码,表示该表正处于"Check Pending"状态,需要用"IMMEDIATE CHECKED"选项执行"SET INTEGRITY"命令,即立即检查其完整性。

打破外键关联的环,检查完整性

通过多次执行上述两个SHELL程序,可以判断出数据库SCHEMA中是否存在外键关联环。通过分析数据库SCHEMA文件,找出这个环,并找到这个环上的一个依赖关系,执行以下步骤:

1、找到外键关联环上的一个依赖关系

2、删除这个外键


db2 ALTER TABLE a1 DROP FOREIGN KEY a1_FK02

3、检查完整性并验证完整性

执行"CheckIntegrity.sh"、"CntDb.sh",如果完整性检查成功,则执行第4步;如果多次执行这两个SHELL后,完整性均没有检查成功,说明可能还有其他的外键关联环,需要再次执行第1步。

4、重建这个外键关联

从新数据库SCHEMA文件中提取出刚才被临时删除的外键关联的语句,在命令行执行这些语句。



参考资料

  • IBM:IBM DB2 Universal Database Command Reference(Version 8),IBM,2002。

  • IBM:IBM DB2 Universal Database SQL Reference Volume 2(Version 8),IBM,2002。

  • IBM:IBM DB2 Universal Database Message Reference Volume 2(Version 8),IBM,2002。

  • IBM:IBM AIX 5L Commands Reference Volume 1(Version 5.1),IBM,2001。

  • IBM:IBM AIX 5L Commands Reference Volume 5(Version 5.1),IBM,2001。


关于作者

用 AWK 实现 DB2 数据库 Schema 的同步
用 AWK 实现 DB2 数据库 Schema 的同步

郑靖华是北京宇信易诚科技有限公司的项目经理,致力于金融行业应用的开发和管理。

上一页  1 2 3 4 5 

Tags:AWK 实现 DB

编辑录入:coldstar [复制链接] [打 印]
赞助商链接