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

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

136 lines
6.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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
当前代码生成器在信息模式查询中使用:
```sql
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 搜索顺序为:
```text
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 解析策略、系统表访问策略和生成键集成验证方案;本报告只记录现状,不提出或实施源码、配置、数据库结构修复。