1、背景
随着软件的使用,随着用户对软件的熟悉和业务过程的理解,以及用户业务流程发生的新变化,软件往往需要进行各种维护和升级以满足用户不断发展的需要。在这种维护过程中,数据库结构也需要不断加以升级,如建新表,在表中增加新的列,修改原有列的类型,增加新的存储过程等。
在进行数据库结构升级时,受时间和空间的限制,开发人员不可能到用户单位操作可视化的数据库管理工具,而需要写代码来实现数据库结构的修改。因此,需要一种能够自动检测并升级数据库结构的方法。
2、目标范围分析
客户端程序的修改,将数据库升级脚本附加到主程序中。
3、方案
客户端程序运行将自动检测并升级服务器端的数据库。结合当前客户端程序的启动逻辑,增加数据库升级逻辑部分,详细的升级逻辑图如下所示:(图片没传上来,请稍等……)
1)、方案中要通过客户端的运行,检测服务器端的数据库是否需要升级,如果需要升级,由程序的运行直接升级服务器端的数据库。由于是对服务器端的数据库进行操作,需要考虑的问题如下:
A、为了确保数据的安全性,在对数据库进行升级前,最好要将原有数据库进行备份。
但由于,备份数据库开销很大,因此,不作为本方案考虑的重点。
2)、当某一客户端的用户运行客户端程序时,检测到服务器端数据库需要升级,在升级的过程中,如再有其他用户也连接此服务器,则要提示用户,系统在升级中……请稍候再登陆。否则,由于多用户操作,导致升级重复,数据库出错。具体解决办法为:在数据库的系统参数表toption中,增加升级令牌 updateToken 字段default(0),类型为bit 。(此升级令牌字段表示,当数据库需要进行升级时,如果升级令牌为0则没有对数据库执行升级,而如果为1表示正对数据库执行升级)
如果有用户检测到需要对数据库进行升级时,先要判断系统参数表toption 中的升级令牌字段是否为0,为0则将toption表中的升级令牌 updateToken 字段更新为1,为1则提示“系统在升级中……请稍候再登陆“。
3)、对数据库结构升级方法的核心思想是:每个程序根据需要(程序版本和数据库版本之间的跨度),创建一系列的数据库升级补丁,为每个补丁指定相应的用于数据库升级的.sql文件名称。并分配一个唯一的ID。当程序启动时,逐个运行这些补丁,从而对数据库进行升级,并且把运行升级的补丁的情况(如 升级日期、升级内容、是否成功等信息)记录到一个特殊的数据库表中(我们记为数据库升级补丁表),这样一方面能够把这些重要信息记录下来,方便日后查询,另一方面也能够避免升级补丁重复运行。
数据库升级补丁表结构如下所示:(图片没传上来,请稍等……)
4)、数据库结构的每一次升级可以看做是对数据库的一个补丁,这个补丁就是一个.sql文件的脚本语句。为了准确对数据库进行更新,既不能有所遗漏,又避免重复更新,需增加一个特殊的数据库表DBUpgradeLog(数据库升级日志表),用来记录数据库更新情况。DbUpgradeLog表的结构如下所示:(图片没传上来,请稍等……)
当应用程序启动时,首先检测是否有尚未执行或者执行失败的数据库升级脚本,即数据库补丁。如果有,则执行这些脚本,并把执行的情况记录到DbUpgradeLog表中。
数据库结构升级( 3)、4) )部分小结:
程序启动时,首先检测数据库升级日志表DbUpgradeLog是否存在,如果不存在,则创建。然后再创建用于数据库升级的补丁列表,并针对每一个补丁进行检测,看这个补丁此前是否曾经被成功执行过。如果数据库中没有关于这个补丁的记录,则说明这是一个新的补丁,需要执行,并把执行结果记录在DbUpgradeLog表中;如果数据库中有关于这个补丁的记录,但是没有执行成功,则再重新尝试执行这个补丁,并相应的更新DbUpgradeLog表的记录。