用 AWK 实现 DB2 数据库 Schema 的同步
2007-04-09 22:17:11 来源:WEB开发网- ·数据库人员面试: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。
关于作者
郑靖华是北京宇信易诚科技有限公司的项目经理,致力于金融行业应用的开发和管理。 |
更多精彩
赞助商链接