记录当前Git开发基线、Kingbase真实表结构、培训数据与权限状态。 补充数据库与代码差异、只读兼容性验证及PRD V1.0核心对象映射,未包含业务代码或数据库修改。
136 lines
6.6 KiB
Markdown
136 lines
6.6 KiB
Markdown
# 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 解析策略、系统表访问策略和生成键集成验证方案;本报告只记录现状,不提出或实施源码、配置、数据库结构修复。
|