• 数据库脚本适配
  • 高斯数据库模式
    高斯数据库在创建数据库时可以指定兼容的数据库类型,可以指定A、B、C、PG,分别表示兼容Oracle、MySQL、Teradata(TD)和PostgreSQL。默认使用A兼容类型。
    高斯数据库在设置PG模式下大部分是兼容人大金仓语法的。但是一些函数,触发器之类的语法基本都是要参考oracle的。

  • 数据库脚本初始化

        在金仓导出的表语句需要适配才能导入到高斯数据库中,具体需要修改以下信息:

  1. 去掉”模式名”. (去掉表模式名)
  2. 替换CHARACTER VARYING 为 varchar
  3. 替换 byte) 为 )
  4. 替换 char) 为 )
  5. 去掉初始脚本前33行之前的内容(内容到第一个创建表语句开始)
  6. 删除 -- 开头的注释。(notepad可以通过正则-- .*?(?=\n)替换)
  7. 删除"Public".
  8. (重置序列的语法)删除sys_catalog.

        索引sql语法需要单独处理,执行的时候仅替换索引文件sql

1.通过正则进行替换(两种类型都需要替换)
                CREATE INDEX (\w+) ON (\w+) USING
                CREATE INDEX \1 ON "\2" USING
                CREATE UNIQUE INDEX (\w+) ON (\w+) USING
                CREATE UNIQUE INDEX \1 ON "\2" USING
        2.替换USING BTREE ( 为 ("
        3.替换); 为");
        4.替换, 为 ", "

高斯数据库导入的sql如果不加双引号的情况下默认是小写,并且大小写不敏感,如果加双引号,就大小写敏感。所以需要替换所有的双引号,但是项目中个别封装的程序,对字段进行了加引号操作,所以也要注意适配。

        通过正则去掉双引号的时候要注意,不能把数据库表中存的数据的双引号去掉。要把插入数据和表结构分开对数据进行处理。

  1. 通过正则进行去掉双引号:\"(.*?)\"  替换为 \1
  2. WORKER_NODE表中设计到的id字段需要加双引号并且大写(雪花算法用到的表)
  3. 字段中如果使用form关键字也需要加引号

 触发器的脚本需要按照oracle语法进行适配。(主要涉及xxl定时应用的触发器语法适配)。

二、项目中的语法适配

在pg模式中 大部分是兼容金仓语法的,不过一些个别的函数,需要根据oracle语法进行适配。目前项目中涉及到需要修改的语法:

2.1、sql中涉及的if语法需要适配:

示例:

<if test="_databaseId == 'kingbase'">
     IF(matter_type = 'jg', 'case_concert_examine_jg', 'case_concert_examine_zf') AS type ,
</if>
<if test="_databaseId == 'postgresql'">
     CASE
    WHEN matter_type = 'jg' THEN 'case_concert_examine_jg'
    ELSE 'case_concert_examine_zf'
    END AS type ,
</if><if test="_databaseId == 'kingbase'">
     IF(matter_type = 'jg', SUBSTRING(matter_code, 9, 2), SUBSTRING(matter_code, 3, 2)) AS matter_type,
</if>
<if test="_databaseId == 'postgresql'">
     CASE
    WHEN matter_type = 'jg' THEN SUBSTR(matter_code, 9, 2)
    ELSE SUBSTR(matter_code, 3, 2)
    END AS matter_type,
</if>
2.2、flyway适配之后要根据配置的执行sql路径创建对应的文件目录。

        flyway 在未适配前会报错,execute error. SET ROLE "库名",主要是因为flyway"PostgreSQLConnection 类中的 doRestoreOriginalState 方法。将数据库连接的角色(role)重置为其原始值。高斯不支持此语法。可以参考下面的flyway适配高斯文档进行处理。

三、项目中涉及到的其他应用适配

四、高斯数据库使用期间问题:

1、gsql 505.1.RC1 和 505.0的版本相差巨大,迁移数据需要修改语法。505.1中的建表sql会增加toast_storage_type 要去掉这个类型 才能在505.0版本插入。

2、A模式下 gsql 505.1.RC1 之前不兼容oracle的Dual虚表。需要用sys_dummy替换。