从 192 升级到 200 时 h2 数据库的升级问题:比例不能大于精度

Upgrade problem with h2 database when upgrading from 192 to 200 : Scale must not be bigger than precision

几年前,我编写了一个应用程序来将数据捕获到 H2 数据文件中,以便于传输和存档。该应用程序是使用 H2 1.4.192 编写的。

最近,我一直在重新审视与该应用程序相关的一些加载代码,我发现我在 H2 1.4.200 中做的一些事情有一些实质性的收获。

我希望能够加载我之前保存到其他数据库的数据。但是我有一些 tables 使用了现在无效的精度比例规范。这是一个例子:

创建缓存 TABLE PUBLIC.MY_TABLE(MY_COLUMN DATETIME(23,3) SELECTIVITY 5)

使用 1.4.192 创建的包含 table 的 H2 数据库不会在 1.4.200 上加载, 他们将收到以下错误:

Scale($"23") 不能大于 precision({1}); SQL 声明: 创建缓存 TABLE PUBLIC.MY_TABLE(MY_COLUMN DATETIME(23,3) SELECTIVITY 5) [90051-200] 90051/90051(帮助)

我的问题是如何才能更正无效的 table 架构?我的应用程序利用与 H2 数据库的连接,然后将它包含的数据加载到另一个数据库中。理想情况下,我希望我的应用程序能够检测到这种情况并自动修复它,以便该应用程序可以简单地利用旧数据文件。但是在 H2 1.4.200 中,我在连接时立即收到错误。

是否有 secret/special 模式允许我将 1.4.200 连接到数据库以修复其架构?我希望???

除此之外,我唯一的选择似乎是为不同版本的 H2 使用单独的类加载器,并在类加载器中进行补救操作,在另一个类加载器中进行加载操作。或者启动另一个 JVM 实例来执行补救操作。

我想在做大量工作之前检查选项。

此问题类似于 this 报告的问题,但没有具体说明他如何执行解决方案。

此数据类型无效且从未被 H2 支持,但由于 bug,旧 H2 以某种方式接受了它。

  1. 您需要使用
  2. 将数据库导出到 1.4.192 Beta 脚本
SCRIPT TO 'source.sql'

您需要使用原始数据库文件,因为如果您使用 1.4.200 从 1.4.192 Beta 打开文件,它可能会被它损坏,不支持这种自动升级。

  1. 您需要使用文本编辑器将 DATETIME(23,3) 替换为 TIMESTAMP(3) 或您需要的任何内容。如果导出的 SQL 对于常规文本编辑器来说太大,您可以使用流编辑器,例如 sed:
sed 's/DATETIME(23,3)/TIMESTAMP(3)/g' source.sql > fixed.sql
  1. 现在您可以使用 1.4.200 创建一个 new 数据库并将编辑的脚本导入其中:
RUNSCRIPT FROM 'fixed.sql'