2009-02-15 143 views
10

我正在使用本地SQLite数据库的AIR应用程序,并且想知道当我分发新版本的应用程序时,如何管理数据库模式更新。还考虑跳过某些版本的更新。例如。而不是从1.0升至1.1,从1.0升至1.5。数据库模式更新

你会推荐什么技术?

回答

7

我们的脚本每一个DDL更改为DB,当我们做一个“释放”,我们将它们连接成一个单一的“升级版”的剧本,再加上“自从上次”

我们已改变的任何存储过程一个存储应用的最新补丁版本号的表格 - 所以升级工具可以应用任何更新的补丁。

每个存储过程都在一个单独的文件中。每一个都以一个“插入”语句开始,以存储名称为SProc,Version和“now”的日志表。 (实际上是一个SProc被执行来存储这个,它不是一个原始的插入语句)。

有时在部署过程中,我们手动更改SProc,或者从DEV开始部署&结束赔率,并且比较客户端的TEST和PRODUCTION数据库上的日志,这使我们能够检查所有内容都处于相同版本。

我们还有一个“发布”主数据库,我们将更新应用到这个数据库,并且我们使用新安装的恢复备份(节省运行脚本的时间,这会显着增加)。我们将其更新为&,因为显然如果它有点陈旧,则可以应用后面的修补程序脚本。

我们的发布数据库还包含消毒起动数据(被删除,或者有时采用&修饰一新,安装上线之前 - 所以这是不包含在任何更新脚本)

SQL Server有一个工具栏按钮以编写更改脚本 - 因此您可以使用GUI工具进行所有更改,但不是保存它们而是生成脚本。 (实际上,有一个复选框总是生成一个脚本,所以如果你忘记了,只是按保存它仍然给你之后既成事实使用的脚本,它可以保存为补丁文件)

+0

+1。我遵循一个类似的流程,并且效果很好。 – 2009-02-16 01:16:07

1

海事组织最容易做的事情是处理来自1.0到1.5作为从1.0到1.1,1.1到1.2等的一系列更新。对于每个版本更改,请保留一段转换脚本/一段代码。

然后,在数据库中保留一个带有版本字段的表格,并将所需版本编译到应用程序中。在启动时,如果版本字段与编译版本不匹配,请逐个运行所有必需的转换脚本。

转换脚本理想情况下应该在提交事务之前启动事务并将新版本作为最后一条语句写入数据库。

1

我在考虑的是将SchemaVersion表添加到数据库中,该数据库为存在的每个版本保存记录。 SchemaVersion表的最后一个版本是数据库的当前级别。

我要创建执行的1.0初始设置后,从1.0升级到1.1,1.1〜1.2(SQL)脚本等

即使一个新安装到例如1.2将贯穿所有这些脚本。这可能看起来有点慢,但只能在一个(几乎)空的数据库上完成一次。

这样做的一大优点是全新安装将具有与升级安装相同的数据库架构。

正如我所说:我正在考虑这一点。我可能会在明天开始实施。如果你有兴趣,我可以分享我的经验。我将为一个c#应用程序实现这个功能,该应用程序使用SQL Server和MySQL作为DBMS的LINQ到实体。

我很有兴趣听到别人的建议和想法,如果有人能指出我的开源.net库或实现类似这样的类,那会很棒。

编辑: 在对不同的question here on SO的答案我找到了对Migrator.Net的引用。我今天开始使用它,它看起来像我正在寻找的。

20

对于SQLite,您可以使用user_version编译指示来跟踪数据库的版本。要获得版本:

PRAGMA user_version 

要设置版本:

PRAGMA user_version = 5 

我则保持各组的更新在SQL文件(这是内嵌在应用程序)并运行起来需要更新到最新版本:

Select Case currentUserVersion 
Case 1 
    // Upgrade to version 2 
Case 2 
    // Upgrade to version 3 
Case etc... 
End Select 

这可让应用程式自动更新到最新版本,无论数据库的最新版本。

0

我在写一个.net应用程序时遇到了同样的问题。

最后我写了自己的升级框架来完成这项工作(因为它是用C#编写的,所以不适合你)。你可能想看看link text来获得一些想法。