关于数据库应用系统的版本升级问题,有一个问题困扰了我很久,那就是如何比较开发服务器和正式服务器上的两个同名表在数据上有何差异。
一般情况下,我们所创建的数据库系统都会有几个表是属于应用系统正常运行的基础表,里面的数据会被硬编码进应用程序,这样的数据在运行时是不能更改的。
举个简单例子,假设我们的系统里有个表叫“功能表”,里面存储本系统所有已实现的功能代码和说明,用于权限分配及控制。这个表就是基础表,里面的数据就是固定数据,除非系统版本升级才有可能改动里面的记录外,其他任何时候都不能变动里面的数据,否则应用系统就可能会运行失常。
如果我们的系统里面有若干个这样的基础表,那么在系统升级的时候,我们就面临这样一个问题:假设最新版程序增加了10个功能,并且已经在“功能表”中插入这些数据,同时修改了原有的15条功能记录的某个字段的值,那么,我们如何将开发数据库中“功能表”的新增和变更内容实施到正式服务器上去?
也许有人会提出这样的方案——把正式服务器上的“功能表”清空,然后导入开发服务器上的数据。
这个方案有几个问题:(1)一个设计良好的数据库系统,必然有着良好的参照完整性约束,删除正式数据库可能会比较麻烦。(2)不符合“增量”升级的思想。(3)如何导入数据也是一个问题,最起码也要把开发数据库表内的记录生成Insert SQL脚本才行。
综合各方面的考虑,我一直在找一个方案,能够比较两个数据库中相同表的记录,并且能够生成合并两者的差异的SQL语句。找了很久而不得,由于时间关系,自己也一直没抽出时间来写这样一个程序。
直到某一天突然发现了SQL Server 2005附带的一个命令行工具“TableDiff”。
这正是我要的东西。它的语法并不复杂,大家可以查看联机帮助或者在命令提示符下键入“TableDiff /?”。
我举个例子吧,这就是它的用法:
C:/Program Files/Microsoft SQL Server/90/COM>tablediff -sourceserver 192.168.0.1 -sourcedatabase books -sourcetable T_Users -sourceschema dbo -sourcepassword sa -sourceuser sa -destinationserver 192.168.0.200 -destinationdatabase books -destinationtable T_Users -destinationschema dbo -destinationpassword sa -destinationuser sa -c -o c:/ls.sql -f
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1476978