从 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.4.192 Beta 脚本
SCRIPT TO 'source.sql'
您需要使用原始数据库文件,因为如果您使用 1.4.200 从 1.4.192 Beta 打开文件,它可能会被它损坏,不支持这种自动升级。
- 您需要使用文本编辑器将
DATETIME(23,3)
替换为 TIMESTAMP(3)
或您需要的任何内容。如果导出的 SQL 对于常规文本编辑器来说太大,您可以使用流编辑器,例如 sed
:
sed 's/DATETIME(23,3)/TIMESTAMP(3)/g' source.sql > fixed.sql
- 现在您可以使用 1.4.200 创建一个 new 数据库并将编辑的脚本导入其中:
RUNSCRIPT FROM 'fixed.sql'
几年前,我编写了一个应用程序来将数据捕获到 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.4.192 Beta 脚本
SCRIPT TO 'source.sql'
您需要使用原始数据库文件,因为如果您使用 1.4.200 从 1.4.192 Beta 打开文件,它可能会被它损坏,不支持这种自动升级。
- 您需要使用文本编辑器将
DATETIME(23,3)
替换为TIMESTAMP(3)
或您需要的任何内容。如果导出的 SQL 对于常规文本编辑器来说太大,您可以使用流编辑器,例如sed
:
sed 's/DATETIME(23,3)/TIMESTAMP(3)/g' source.sql > fixed.sql
- 现在您可以使用 1.4.200 创建一个 new 数据库并将编辑的脚本导入其中:
RUNSCRIPT FROM 'fixed.sql'