我正在开发一些 Delphi 应用程序,当新版本发布和用户选择安装附加模块时,它们需要在现场升级自己的数据库结构。这些应用程序正在使用各种嵌入式数据库(目前 DISAM 和 Jet,但这可能会改变)。
在过去,我使用 DISAM 使用用户版本号来完成此操作,而不是可以存储在每个表中。我提供了一组额外的空数据库文件,并在启动时使用 FieldDefs 比较每个表的版本号,以便在必要时更新已安装的表。虽然这行得通,但我发现必须发送数据库的备用副本很笨拙,并且较新版本的 DBISAM 更改了表重组方法,因此无论如何我都需要重写它。
我可以看到两种实现方式:在数据库中存储版本号并使用 DDL 脚本从旧版本获取新版本,或者在应用程序中存储数据库结构的参考版本,在启动时比较对数据库的引用- up,并让应用程序生成 DDL 命令来升级数据库。
我认为我可能不得不实现两者的一部分。我不希望应用程序每次启动时都将数据库与参考结构进行比较(太慢),所以我需要一个数据库结构版本号来检测用户是否使用过时的结构。但是,当数据库过去可能已部分更新或用户可能自己更改了数据库结构时,我不确定我是否可以信任预先编写的脚本来进行结构升级,所以我倾向于使用实际更新的参考差异。
研究这个问题我发现了几个数据库版本控制工具,但它们似乎都针对 SQL Server 并且在实际应用程序之外实现。我正在寻找一个可以紧密集成到我的应用程序中并且可以适应不同数据库要求的进程(我知道我必须编写适配器、自定义后代类或事件代码来处理 DDL 中的各种差异数据库,这不会打扰我)。
有没有人知道现成的东西可以做到这一点或失败,有没有人有任何想法:
在应用程序中存储通用关系数据库结构的参考版本的最佳方式。
将参考与实际数据库进行比较的最佳方法。
生成 DDL 以更新数据库的最佳方式。