85 lines
5.4 KiB
Markdown
85 lines
5.4 KiB
Markdown
# RailwaySystem 数据库 V2 迁移执行计划 (Round 1 修订版)
|
||
|
||
> **执行基线**:KingbaseES V009R003C018 (`schema=public`)
|
||
> **设计依据**:[`RailwaySystem 数据库 V2 字段设计与 Kingbase DDL 规范 V1.0.md`](../archive/database-history/RailwaySystem%20数据库%20V2%20字段设计与%20Kingbase%20DDL%20规范%20V1.0.md) 及 Round 1 审查要求
|
||
> **前置条件**:当前正式库中 `train_teacher` 精确包含 1 行数据,其余 13 张现有表均为 0 行。
|
||
|
||
---
|
||
|
||
## 1. 迁移执行总体流水线 (含 Preflight 与单文件事务)
|
||
|
||
整个迁移任务划分为 6 个严格阶段,每个主脚本均自包含显式 `BEGIN ... COMMIT` 事务边界:
|
||
|
||
```mermaid
|
||
flowchart TD
|
||
S0[Stage 0: 000 只读基线预检 Preflight] -->|核验通过| S1[Stage 1: 001 数据快照与结构备份]
|
||
S1 -->|防覆盖校验通过| S2[Stage 2: 物理结构准备]
|
||
subgraph Stage 2: 物理结构准备 (各脚本独立事务)
|
||
S2_1[002_create_new_tables.sql] --> S2_2[003_alter_master_tables.sql]
|
||
S2_2 --> S2_3[004_rebuild_business_tables.sql]
|
||
end
|
||
S2 --> S3[Stage 3: 完整性约束与索引注入]
|
||
subgraph Stage 3: 完整性建立 (各脚本独立事务)
|
||
S3_1[005_constraints.sql] --> S3_2[006_indexes.sql]
|
||
end
|
||
S3 --> S4[Stage 4: 数据平滑迁移与旧表淘汰]
|
||
subgraph Stage 4: 数据平滑处理 (各脚本独立事务)
|
||
S4_1[008_migrate_teacher.sql] --> S4_2[009_drop_legacy_score.sql]
|
||
end
|
||
S4 --> S5[Stage 5: 010 全面自动化强断言验收]
|
||
S5 -->|验收全部 PASS| DONE((迁移阶段成功闭环))
|
||
S5 -.->|任何断言 FAIL| ROLLBACK[触发 rollback 逆向流水线]
|
||
```
|
||
|
||
---
|
||
|
||
## 2. 阶段明细与操作规范
|
||
|
||
### Stage 0: 只读基线预检 Preflight
|
||
- **执行脚本**:[`000_preflight.sql`](../../RuoYi-Vue/sql/train/v2/000_preflight.sql)
|
||
- **目标**:纯只读排查当前环境确实精确处于 Phase 0.5 初始状态。
|
||
- **核验准则**:
|
||
- 14 张旧表全部存在,8 张 V2 新表均不存在;
|
||
- `train_teacher` 精确为 1 行,其余 13 张旧表精确为 0 行;
|
||
- 旧外键 `fk_classplan_course`、旧唯一约束及 9 个旧触发器全部完备。
|
||
- **阻断控制**:任何一项不符合,立即抛出异常中止,拒绝进入未知环境。
|
||
|
||
### Stage 1: 数据快照备份
|
||
- **执行脚本**:[`001_backup_current_schema.sql`](../../RuoYi-Vue/sql/train/v2/001_backup_current_schema.sql)
|
||
- **目标**:在显式事务中为当前 14 张培训旧表建立物理快照(`bak_v1_*`)。
|
||
- **防覆盖控制**:若检测到既有 `bak_v1_*` 已存在,立即抛出异常强阻断,杜绝二次执行覆盖最初 V1 备份。
|
||
|
||
### Stage 2: 物理结构准备
|
||
- **执行脚本**:
|
||
1. [`002_create_new_tables.sql`](../../RuoYi-Vue/sql/train/v2/002_create_new_tables.sql):新建 8 张 V2 表(`t_id` 必填,场地互斥 CHECK,分数非负 CHECK);
|
||
2. [`003_alter_master_tables.sql`](../../RuoYi-Vue/sql/train/v2/003_alter_master_tables.sql):卸载主数据旧触发器,显式解除旧外键,调整 8 张主数据表结构(移除猜测默认值,加 `capacity > 0` CHECK);
|
||
3. [`004_rebuild_business_tables.sql`](../../RuoYi-Vue/sql/train/v2/004_rebuild_business_tables.sql):校验 0 行后,显式解绑旧外键并常规 DROP,按照 `enrollment_id` / `lesson_id` 重建 5 张业务表(增加学时时间与单号系统匹配 CHECK)。
|
||
|
||
### Stage 3: 完整性约束与索引注入
|
||
- **执行脚本**:
|
||
1. [`005_constraints.sql`](../../RuoYi-Vue/sql/train/v2/005_constraints.sql):集中为 21 张表建立 13 组 UNIQUE 约束、26 组 `ON DELETE NO ACTION` 外键与全量单行 CHECK 约束;
|
||
2. [`006_indexes.sql`](../../RuoYi-Vue/sql/train/v2/006_indexes.sql):创建外键索引、排课多维复合冲突索引及双非空部分唯一索引。
|
||
|
||
### Stage 4: 数据平滑迁移与旧表淘汰
|
||
- **执行脚本**:
|
||
1. [`008_migrate_teacher.sql`](../../RuoYi-Vue/sql/train/v2/008_migrate_teacher.sql):将教师历史数据映射至新列,校验数据完整性后将 `status` 与 `del_flag` 固化为 NOT NULL,安全删除旧列;
|
||
2. [`009_drop_legacy_score.sql`](../../RuoYi-Vue/sql/train/v2/009_drop_legacy_score.sql):前置 0 行校验后,显式解除历史约束并安全常规 DROP。
|
||
|
||
### Stage 5: 全面自动化强断言验收
|
||
- **执行脚本**:[`010_verify.sql`](../../RuoYi-Vue/sql/train/v2/010_verify.sql)
|
||
- **目标**:实现“失败即失败”,逐表逐项强断言,出现任何偏差直接抛异常报错。
|
||
|
||
---
|
||
|
||
## 3. 业务字典脚本定位特别说明
|
||
|
||
[`007_dicts.sql`](../../RuoYi-Vue/sql/train/v2/007_dicts.sql) **在当前数据库结构迁移阶段明确跳过、不执行**。
|
||
原因:该脚本向 `sys_dict_*` 系统表写入业务字典数据,属于 API 契约与权限设计范畴。当前阶段保持数据库结构与应用层配置解耦,待后续权限设计阶段统一执行。
|
||
|
||
---
|
||
|
||
## 4. 断点恢复与精确回滚机制
|
||
|
||
- **单脚本失败自动撤销**:由于各脚本包含显式 `BEGIN ... COMMIT`,单脚本内部任何错误会自动触发事务 ROLLBACK,数据库保持在上一个脚本执行成功的整齐状态;
|
||
- **精确全量回滚保障**:若需全量还原,严格基于 [`rollback/000_phase05_exact_schema.sql`](../../RuoYi-Vue/sql/train/v2/rollback/000_phase05_exact_schema.sql) 的真实物理 DDL 重建结构,结合 `bak_v1_*` 快照灌回数据,彻底消除 CTAS 丢失结构缺陷。
|