检查两个数据库里的表名、字段是否一致的一种方法

不知道大家有没有遇到过这种情况。 程序已经给客户安装上了,并且客户已经录入了一些信息,然后程序还需要作比较大的变动(修改功能、增加模块等),数据库就不可避免要做一些改动。 但是这时候已经不能把客户的数据库删掉,换上新的数据库了。只能用添表、添字段的方式了。 如果修改程序的时候做了详细的文档的话,那么就可以按照文档来修改数据库了,但是如果没有文档,或者文档记录的不全,或者修改完成之后想检查一下有没有“漏网之鱼”。那么这时候应该怎么办呢?难道要一个一个的检查?! 我们可以使用两个视图和几个SQL语句来检查一下。 1、建立视图: 这个视图大家不太陌生吧,写过代码生成器的兄弟们都很熟悉吧。 他可以看到一个数据库里的表名、字段名、字段类型、和字段大小的信息。 建立两个这样的视图,一个读取客户的数据库,一个读取新的数据库。这样我们就有了两个数据库的表和字段的信息的列表了。 对了还有一个前提:把新的数据附加到客户的服务器上去。然后才行。 _Sys_Other_TableInfo

SELECT TOP  PERCENT obj.name AS TableName, col.name AS ColName, col.xtype, 

      col.length

FROM 新数据库.dbo.syscolumns col INNER JOIN

      新数据库.sysobjects obj ON col.id = obj.id

ORDER BY obj.name

_Sys_TableInfo

SELECT TOP  PERCENT obj.name AS TableName, col.name AS ColName, col.xtype, 

      col.length

FROM dbo.syscolumns col INNER JOIN

      .sysobjects obj ON col.id = obj.id

ORDER BY obj.name

2、执行查询语句

我们可以使用 not in 的方式来检查表名是否一致。

select * from __Sys_other_TableInfo

where tablename not in (

select tablename from _Sys_TableInfo )

执行之后会显示客户的数据库里缺少的表的名字和表里的字段。

表一致了之后,我们开始来检查字段名称。

select * from _Sys_other_TableInfo bb

where colname not in (

select colname from _Sys_TableInfo aa where aa.tablename = bb.tablename)

执行之后会显示客户的数据库里没有的字段的名称。当然是在表名一致的前提下才能进行字段的对比。

3、下面就是对照字段类型,然后字段的大小。

需要的SQL语句我还没有写出来。估计不是太难吧。

这种方法已经在我的一个项目里试验了一下,基本是正确的。

4、不过还是发现了几个问题。

1、缺少表的话可以使用企业管理器来自动生成键表语句,但是添加字段就有一点麻烦了。不知道大家有没有什么好的办法。

2、不光是检查表,还可以检查视图和存储过程(自定义函数能不能检查到还没有测试)。不过对于视图和存储过程 只能得知名称和字段、参数是否一致,如果参数没有变化,只是修改了一下内容的话就检查不出来了。

3、如果是修改表名或者是修改字段名、删除字段名就没有检查了。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏沃趣科技

ASM 翻译系列第十八弹:ASM Internal ASM file number 5

原作者:Bane Radulovic 译者: 魏兴华 审核: 魏兴华 ASM file number 5 本章讲述ASM的5号文件,5号文件是ASM...

3536
来自专栏乐沙弥的世界

Oracle 基于用户管理恢复的处理

Oracle支持多种方式来管理数据文件的备份与恢复来保证数据库的可靠与完整。除了使用RMAN工具以及第三方备份与恢复工具之外,基于

532
来自专栏杨建荣的学习笔记

使用外部表关联MySQL数据到Oracle(r6笔记第100天)

因为业务需要,有个临时的活动需要DBA来支持一些数据业务,问题来了,需要从MySQL端同步一部分数据到Oracle端,然后从Oracle端匹配查 到相应的数据返...

2814
来自专栏乐沙弥的世界

只读表空间的备份与恢复

--====================== --  只读表空间的备份与恢复 --====================== 一、只读表空间的特性...

852
来自专栏黑白安全

秒杀杀软的badusb

我们看过很多黑客电影,上面的黑客利用一个U盘轻松入侵到对方计算机。觉得很酷,今天我们也来做一个吧。

8704
来自专栏Grace development

五分钟入门 Dingo API

Dingo API帮助您轻松快速地构建自己的API。虽然这个方案的目标是尽可能保持灵活性,但它仍然不能涵盖所有情况并解决所有问题。

6911
来自专栏杨建荣的学习笔记

通过ORA错误反思sql语句规范(r4笔记第41天)

今天快下班的时候,有个开发的同事问我一个问题,说他在客户端执行一条sql语句,里面包含子查询,如果单独执行子查询,会报"invalid identifier"...

2463
来自专栏数据和云

案发现场:被注入的软件及 ORA-600 16703 灾难的恢复

最近帮助一个客户恢复数据库,遇到了如下这个问题。让我们再一次惊醒于数据安全,如果不做好防范,问题总是会来得猝不及防。

2124
来自专栏逸鹏说道

SQL Server 数据库清除日志的方法

SQLSERVER的数据库日志占用很大的空间,下面提供三种方法用于清除无用的数据库日志文件 方法一: 1、打开查询分析器,输入命令 BACKUP LOG d...

3615
来自专栏杨建荣的学习笔记

一个慢查询报警的简单处理 (r8笔记第12天)

今天在做节后的一个基本检查的时候,发现一个不太起眼的报警,报警内容为大体为: MySQL 每秒慢查询次数超过 <1>个on xxxx 查看zabbix的监控数...

3468

扫码关注云+社区