docs(db): 完成数据库V2最终迁移验收

This commit is contained in:
wangzhibiao committed 2026-09-14 02:42:22 +08:00
1 parent 487583c2aa
commit 751b751f14
1 file changed
+114
@@ -0,0 +1,114 @@
# RailwaySystem 数据库 V2 最终迁移验收报告 (010_verify PASS)
本文档记录 RailwaySystem 数据库 V2 迁移从双门禁、备份、结构演进、数据迁移、表下线至最终全量定义级验收的完整审计结果。
---
## 一、迁移全周期通过矩阵
| 迁移阶段 | 对应执行脚本 / 门禁 | 执行状态 | 事务结果 | 核心验收结论 |
| :--- | :--- | :--- | :--- | :--- |
| **Gate A** | `000_tx_capability_probe.sql` | **PASS** | 显式回滚成功 | 证实 KingbaseES 实例支持 DDL 事务原子性回滚 |
| **Gate B** | `000_preflight.sql` | **PASS** | 只读通过 | 确认精确处于 Phase 0.5 起点 (14旧表, 1教师, 13空表) |
| **Stage 1** | `001_backup_current_schema.sql` | **PASS** | COMMIT | 生成 14 张 `bak_v1_*` 快照,教师唯一真实数据封存 |
| **Stage 2** | `002_create_new_tables.sql` | **PASS** | COMMIT | 建立 8 张 V2 新业务表,行数均为 0 |
| **Stage 3** | `003_alter_master_tables.sql` | **PASS** | COMMIT | 8 张主数据表结构完成解耦改造,卸载旧触发器 |
| **Stage 4** | `004_rebuild_business_tables.sql` | **PASS** | COMMIT | 重建 5 张业务过程表,对齐新领域核心外键与列模型 |
| **Stage 5** | `005_constraints.sql` | **PASS** | COMMIT | 建立 13 组 UNIQUE, 26 组 FK (全 NO ACTION), 9 组 CHECK |
| **Stage 6** | `006_indexes.sql` | **PASS** | COMMIT | 建立 3 组排课冲突时间复合索引、部分唯一索引及外键索引 |
| **Stage 7** | `008_migrate_teacher.sql` | **PASS** | COMMIT | 教师数据无缝映射迁移,固化 NOT NULL,安全清理旧列 |
| **Stage 8** | `009_drop_legacy_score.sql` | **PASS** | COMMIT | 0 行旧成绩表 `train_score_info` 安全下线淘汰 |
| **Stage 9** | `010_verify.sql` | **PASS** | 完整通过 | 21 表定义级深度验收全量 PASS,输出 `[Verify-PASS]` |
---
## 二、010 验收脚本工程审计与兼容性修复复盘
> [!IMPORTANT]
> **关键工程审计记录**:
> 本次迁移过程中,`010_verify.sql` 首次执行时发生脚本语法中断。在此诚实记录该故障的发生根因与修复过程:
>
> 1. **首次失败原因**:
> - 当前 KingbaseES 实例配置为 `database_mode = mysql` 兼容模式。
> - 原 `010_verify.sql` 第 117 行包含动态 SQL 拼接语句:`EXECUTE 'SELECT count(*) FROM ' || r.tbl INTO v_cnt;`。
> - 在 MySQL 模式下,双竖线 `||` 被数据库引擎解析为**逻辑或(Logical OR)**运算符而非字符串拼接。因此 `'SELECT count(*) FROM ' || r.tbl` 在求值时被隐式转为布尔逻辑运算,计算结果为 `false`(字符 `'f'`),随后的 `EXECUTE 'f'` 抛出语法异常 `ERROR: syntax error at or near "f"`。
> - 同时,原脚本在 `actual_unique` 中未限定 `uq_%`,将 Phase 0.5 遗留的旧 `uk_*` 约束误判为 `UNEXPECTED_UQ`;并在索引定义断言中未包含 Kingbase 自动展开的 `NULLS FIRST` 表达式。
>
> 2. **事实定性**:
> - 经独立只读深度核验确认,**真实数据库表结构、约束定义、数据映射与索引等本身 100% 正确无误,未受任何影响**。
>
> 3. **修复与复测**:
> - 严格遵循变更纪律,**严禁修改数据库任何表结构、约束、索引与数据,严禁重跑 001~009**。
> - 仅对 `010_verify.sql` 进行语法与元数据兼容性修复:
> - 动态 SQL 改用安全标识符函数:`EXECUTE format('SELECT count(*) FROM public.%I', r.tbl) INTO v_cnt;`
> - 差异文本拼接改用 `concat(...)` 替代 `||`
> - 唯一约束断言精确聚焦 V2 的 `uq_%` 命名规范
> - 索引断言兼容匹配 Kingbase 引擎生成的 `NULLS FIRST` 格式
> - 重新提交 010 脚本并单独重测,**`010_verify.sql` 顺利执行完毕并完全通过,输出 `[Verify-PASS]`**。
---
## 三、最终数据库状态全量审计矩阵
### 3.1 正式业务表集合 (精确 21 张)
`train_*` 表总数精确为 **21** 张,`train_score_info` 已彻底删除:
1. `train_accommodation`
2. `train_class_plan`
3. `train_class_report`
4. `train_classroom_info`
5. `train_course`
6. `train_course_resource`
7. `train_dorm_auth`
8. `train_dormitory_info`
9. `train_electronic_board`
10. `train_enrollment`
11. `train_lesson`
12. `train_plan_course`
13. `train_resource`
14. `train_score_item`
15. `train_student`
16. `train_student_checkin`
17. `train_student_portrait`
18. `train_student_score`
19. `train_study_duration`
20. `train_teacher`
21. `train_training_site`
### 3.2 备份表集合 (精确 14 张)
14 张 `bak_v1_*` 表全部完好保留,未发生任何变更或误删。
### 3.3 业务数据行数
- `train_teacher`: 精确 **1** 行(`org_name` 已填充,`status=1 NOT NULL`, `del_flag='0' NOT NULL`,旧字段已彻底清理)。
- 其余 20 张正式业务表: 全部精确为 **0** 行。
### 3.4 约束体系
- **13 组 UNIQUE**: 13/13 全部建立成功,定义与所属列完全匹配。
- **26 组 FK**: 26/26 全部建立成功,删除规则严格均为 **`ON DELETE NO ACTION`**,禁止级联。
- **9 组 CHECK**: 9/9 关键检查约束全部就绪并通过逻辑验证。
- **12 个 Identity**: 12 张业务表的自增主键全部保持系统自增特性。
### 3.5 索引体系
- 排课 3 组时间冲突复合索引定义正确:
- `idx_lesson_teacher_time`: `(t_id, start_time, end_time)`
- `idx_lesson_classroom_time`: `(class_room_id, start_time, end_time)`
- `idx_lesson_site_time`: `(site_id, start_time, end_time)`
- 部分唯一索引定义正确:
- `uq_idx_study_source_event`: `(source_system, source_event_id) WHERE source_system IS NOT NULL AND source_event_id IS NOT NULL`
### 3.6 默认值规则
- `train_accommodation.accommodation_status`: 严格默认值为 `0` (预分配)。
- 业务选择型字段(`source_type`, `accommodation_required`, `venue_type`, `checkin_way`, `verify_result`)全部无业务默认值。
### 3.7 系统底座 (sys_*) 基线
- `sys_user`: 1
- `sys_menu`: 106
- `sys_dept`: 15
- `sys_dict_type`: 44
- `sys_dict_data`: 500
*(系统底层零破坏、零改动,007 字典脚本保持未执行状态)*
---
## 四、最终结论
RailwaySystem 数据库 V2 迁移各阶段正式执行完毕,通过 `010_verify.sql` 定义级深度验收与全量只读独立审计,满足全部准出标准。数据库正式进入 V2 生产基线状态。