几年前,我编写了一个应用程序,将数据捕获到H2数据文件中,以便于传输和归档。该应用程序是用H2 1.4.192编写的。
最近,我重新访问了一些与该应用程序相关的加载代码,我发现在H2 1.4.200中所做的一些事情会有一些实质性的收获。
我希望能够将以前保存的数据加载到其他数据库中。但我有一些表格使用了现在无效的精度刻度规范。这里有一个例子:
创建缓存表PUBLIC.MY_TABLE(MY_COLUMN DATETIME(23,3(selection 5(
使用1.4.192创建的H2数据库包含这样的表,将不会在1.4.200加载,他们将得到以下错误:
小数位数($"23"(不能大于精度({1}(;SQL语句:创建缓存表公共.MY_TABLE(MY_COLUMN DATETIME(23,3(SELECTIVITY 5([90051-200]90051/90051(帮助(
我的问题是如何纠正无效的表模式?我的应用程序利用到H2数据库的连接,然后将它包含的数据加载到另一个数据库中。理想情况下,我希望我的应用程序能够检测到这种情况并自动修复,这样应用程序就可以简单地使用旧的数据文件。但在H2 1.4.200中,我在连接时直接得到了错误。
是否有一种秘密/特殊模式允许我将1.4.200连接到数据库以修复其架构?我希望???
除此之外,我唯一的选择似乎是为不同版本的H2提供一个单独的类加载器,并在类加载器中进行补救操作,在另一个类加载器中执行加载操作。或者启动JVM的另一个实例来执行补救操作。
我想在做大量工作之前先检查一下选项。
这个问题与报道中的问题类似,但没有具体说明他是如何执行决议的。
这个数据类型是无效的,H2从未支持过它,但由于错误,旧的H2以某种方式接受了它。
- 您需要使用将数据库导出到1.4.192 Beta版本的脚本
SCRIPT TO 'source.sql'
您需要使用原始数据库文件,因为如果您从1.4.192 Beta 1.4.200打开文件,它可能会被它损坏,不支持这种自动升级。
- 您需要使用某种文本编辑器将
DATETIME(23,3)
替换为TIMESTAMP(3)
或任何您需要的内容。如果导出的SQL对于常规文本编辑器来说太大,则可以使用流编辑器,如sed
:
sed 's/DATETIME(23,3)/TIMESTAMP(3)/g' source.sql > fixed.sql
- 现在您可以用1.4.200创建一个新的数据库,并将编辑后的脚本导入其中:
RUNSCRIPT FROM 'fixed.sql'