Files
railwaysystem/docs/codebase-audit/16_kingbase_readonly_compatibility.md
wangzhibiao fb00f67d3b docs(审计): 完成Phase 0工程与数据库基线核验
记录当前Git开发基线、Kingbase真实表结构、培训数据与权限状态。

补充数据库与代码差异、只读兼容性验证及PRD V1.0核心对象映射,未包含业务代码或数据库修改。
2026-09-14 00:36:53 +08:00

6.6 KiB
Raw Permalink Blame History

Kingbase 只读兼容性核验

1. 核验边界与方法

本报告针对当前项目实际连接的 Kingbase 实例执行只读探测。连接复用现有数据源配置,通过项目已有 Kingbase JDBC 驱动建立;事务设置为只读,全部业务探测均使用 SELECT、SHOW 或系统目录查询,结束时执行回滚并关闭连接。未执行任何 DDL、DML、迁移或生成键写入测试,也未在报告中记录连接密码。

当前环境证据:

项目 实际结果
数据库产品 KingbaseES V009R003C018
JDBC 驱动 Kingbase8 JDBC Driver V008R006B0001;Maven 依赖版本 8.6.0
database training
schema public
database_mode mysql
服务端兼容基线 server_version 返回 12.1
简单 SELECT 正常

2. 指定语法的实测结果

探测项 无副作用测试形式 实际结果 分类 对当前代码的含义
date_format 对固定 timestamp 格式化为 %Y%m%d 返回 20260102 兼容模式支持 若依 Mapper 中同类写法可被当前实例解析
ifnull ifnull(null,'fallback') 返回 fallback 兼容模式支持 当前 Mapper 中的空值表达式可被解析
find_in_set find_in_set('2','1,2,3') 返回 2 兼容模式支持 若依数据权限中同类表达式具备语法基础
current_database() 查询当前数据库 返回 training 当前实例直接支持 函数本身可用,但不能代替当前 schema,见第4节
sysdate() 查询当前时间 返回 timestamp 兼容模式支持 MySQL 风格当前时间函数可用
LIMIT 1 OFFSET 1 常规分页 SELECT 正常返回 当前实例直接支持 PostgreSQL/Kingbase 风格分页可用
LIMIT 0,1 MySQL 风格分页 SELECT 正常返回 兼容模式支持 当前 PageHelper helperDialect=mysql 具备语法基础
SELECT 1 FROM dual 数据源校验形式 返回 1 兼容模式支持 当前 Druid validation query 可用
反引号标识符 使用反引号访问 public.sys_menu 字段 正常返回 兼容模式支持 代码生成器中的反引号可被当前实例解析

本次明确列出的 MySQL 语法探测均通过。结论只适用于当前 database_mode=mysql 实例,不能据此推断其他 Kingbase 实例或其他兼容模式也会通过。

3. PageHelper 分页判断

配置依据:

  • ruoyi-admin/src/main/resources/application.yml 中 PageHelper 使用 helperDialect: mysql。
  • 当前实例能够执行 LIMIT offset,row_count,所以 PageHelper 常见的 MySQL 分页尾句在语法层面可用。

只读测试没有启动完整 Web 请求链,也没有核对每一种复杂 Mapper SQL 经 PageHelper 改写后的结果。当前可判定为“分页基础语法兼容”,完整插件行为仍需后续集成测试。

4. 已确认的应用级兼容冲突

4.1 代码生成器把 database 当作 schema

当前代码生成器在信息模式查询中使用:

table_schema = current_database()

当前 current_database() 是 training,实际业务表 schema 是 public。只读核验结果:

  • 按当前生成器条件查询:0 张表;
  • public schema 实际有 46 张表;
  • public.train_teacher 实际有 12个字段,按当前生成器条件查询为0个字段。

因此这不是 SQL 函数不支持,而是 database 与 schema 语义被混用。当前代码生成模块无法依靠这组查询正确发现实际表结构,数据库 V2 前必须明确处理。

相关文件:

  • ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml
  • ruoyi-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml

4.2 sys_* 名称与 Kingbase 系统视图冲突

当前隐式 schema 搜索顺序为:

sys, pg_catalog, sys_catalog, public

sys_catalog 中存在 sys_user、sys_role、sys_config 系统视图,public 中同时存在若依同名业务表。当前若依 Mapper 普遍使用未限定 schema 的表名。只读探测显示:

  • 未限定的 sys_user.user_id 查询失败,命中了系统视图;
  • 未限定的 sys_role.role_id 查询失败,命中了系统视图;
  • 未限定的 sys_config.config_id 查询失败,命中了系统视图;
  • 显式访问 public.sys_user、public.sys_role、public.sys_config 时结构可正常读取。

因此若依登录、角色和配置等核心 Mapper 当前具备真实运行阻塞。该问题不能由“数据库支持 MySQL 函数”这一结论覆盖。

相关文件:

  • ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
  • ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml
  • ruoyi-system/src/main/resources/mapper/system/SysConfigMapper.xml

5. generated keys 与 identity/sequence

当前6张数字主键业务表的主键实际为 bigint GENERATED BY DEFAULT AS IDENTITY,数据库目录能够识别对应内部 sequence。JDBC 元数据结果:

  • IS_AUTOINCREMENT=YES;
  • 驱动声明 supportsGetGeneratedKeys=true。

这说明 MyBatis useGeneratedKeys 具备数据库和驱动基础条件。由于实际插入会修改数据,本阶段没有执行 INSERT,也不能确认所有 Mapper 的生成键回填行为。该项分类为“基础条件满足,完整行为无法只读确认”。

6. 分类结论

当前实例直接支持

  • current_database();
  • LIMIT ... OFFSET ...;
  • 标准只读事务与系统目录查询;
  • identity/sequence 元数据读取。

兼容模式支持

  • date_format;
  • ifnull;
  • find_in_set;
  • sysdate();
  • MySQL 风格 LIMIT offset,row_count;
  • DUAL;
  • 反引号标识符。

明确不支持

本次指定且可安全执行的语法项中,没有发现当前实例明确不支持的项。

无法只读确认

  • MyBatis 在真实 INSERT 场景中的 generated keys 回填;
  • PageHelper 对全部复杂 Mapper SQL 的改写和计数行为;
  • 触发器、批量写入、导入导出等写链路的完整兼容性。

已确认但不属于语法缺失的问题

  • 代码生成器以 current_database() 过滤 table_schema,当前返回空结果;
  • 未限定 schema 的若依 sys_* Mapper 命中 Kingbase 系统视图,核心账号与权限查询会失败。

7. Phase 0判断

当前 Kingbase MySQL 兼容模式覆盖了项目已识别的主要 MySQL 函数和分页形式,但项目不能据此视为“已完成 Kingbase 适配”。数据库 V2 前应先确定 schema 解析策略、系统表访问策略和生成键集成验证方案;本报告只记录现状,不提出或实施源码、配置、数据库结构修复。