公司目前有这样一个需求:研究一个通用的自动升级方案,可以对以前的B/S结构的应用程序进行自动升级。升级包括对程序修改和数据库修改的升级。关键点是对数据库修改的升级。数据库的修改可能是表中数据的修改,也可能是表结构,存储过程,自定义函数的修改,也可能是增加或者删除了表。我的思路是通过C#程序对比新旧两个数据库,生成针对数据库修改的SQL脚本。然后运行该脚本实现数据库的升级。但是不知道这种方法是否可行,C#如何对比数据库也不知道怎么做。不知道园友有没有做过类似的事情,或者有什么好的关于Web应用程序,数据库自动升级的思路或者方法。分享一下啊。谢谢大家了。
看了几位园友的回复,谢谢大家的关注,祝园友们新年快乐。我的问题可能没有表达清楚。问题的核心是:假如有新旧两个版本的数据库,现在是否能通过C#程序来对比数据库,自动生成针对数据库变动的升级脚本?只要升级脚本能用C#程序来自动生成。执行当然不是一个问题。不知道大家有没有什么好的方法,感谢分享。
新旧两个数据库的比较涉及到表定义(结构、索引、分区等等)和表数据两个方面,据我了解,恐怕没有很轻松的方法完成这种比较。我建议还是利用管理的手段,把每次数据库升级的内容都记录下来,在部署升级的时候执行统一的脚本来完成升级。另外如果有多个部署的话,可以制作一个小工具,执行一次脚本来完成所有部署数据库的升级,以此减轻一些工作量。总之,重在加强管理。
不是很明白。直接在执行sql脚本里面做判断不就可以了吗?比如你要新增表字段 ,可以写if exist(xxxx)之类的
我们小组内也有同样的问题,然后自己设计一个升级方案,在数据库中建一个标识数据库版本的表,程序依据期望的数据库版本去和原始数据库的版本比较,然后从升级脚本(xml文件)中按序号执行SQL语句,至于程序升级可以用WebService去完成,提交产品ID、版本等信息,自动从网站上比较后下载,下次执行或等待检测更新完成后提示用户升级,最后注明我们的程序是winform程序。
关注,没有做过
升级前备份数据库; 把要升级的脚本文件准备好,你程序运行时检测这个脚本文件是否存在,存在的话就执行这个脚本;用事务去做;应该没有问题吧;
目前实现的可以通过对比数据库生成增加字段和基础数据的升级。基础数据的是逐条对比,然后拼接sql,字段信息和存储过程信息,分别用了sysobjects ,syscolumndu读取,还有sp_helpText,还有其它一些系统表和系统存储函数。功能是初步是实现了,但如果数据库很大的话估计效率很低。不过我们公司的都是一些小型软件。
现在我也碰到跟你相似的情况,检查指定数据库与标准脚本之间表结构差异,差异检查内容包括:1、是否缺少表;2、表中字段是否缺少;3、字段类型与长度;4、是否缺少视图;5、是否缺少存储过程;6、主键、外键以及索引。当被检查的数据库与标准脚本之间有以上差异,根据标准脚本自动生成相关脚本语局。
现在还没想到怎么用C#来实现,能不能提供一些当初你的解决思路,或者一些例子代码参考下。不甚感激,谢谢。 邮箱:kinguname@163.com
@一片天xf:
你可以把标准数据库脚本执行生成一个数据库,调用系统函数来分别获取两个数据库的相关参数,进行对比,然后根据对比结果,用拼接字符串的方法生成新的升级脚本。
数据库中的表,字段,字段类型,长度,参数,存储过程和视图等信息都是可以从系统表或调用系统存储过程读出来的。具体的SQL我手头现在没有代码,你可以在网上搜搜。
同问,我也在想在这个问题。