# RailwaySystem 数据库 V2 DDL Review 修订记录表 (Round 1) > **评审周期**:Round 1 > **评审基线**:高级技术负责人第一轮人工 Review 意见 > **状态**:**已全部闭环解决 (100% Resolved)** --- ## 修改明细汇总表 | 问题编号 | 模块分类 | 原问题描述 | 涉及修改文件 | 具体修改内容与工程落地 | 解决状态 | | :---: | :---: | :--- | :--- | :--- | :---: | | **REV-01** | **P0 架构** | 破坏性迁移脚本无事务边界,遇错可能部分提交;包含客户端 `\echo` 指令 | [`001`](file:///Users/wzb/Desktop/项目/RailwaySystem/RuoYi-Vue/sql/train/v2/001_backup_current_schema.sql)~[`009`](file:///Users/wzb/Desktop/项目/RailwaySystem/RuoYi-Vue/sql/train/v2/009_drop_legacy_score.sql), [`05_execution_contract.md`](file:///Users/wzb/Desktop/项目/RailwaySystem/docs/database-v2/05_execution_contract.md) | 所有物理 DDL 脚本全面使用 `BEGIN ... COMMIT` 包裹,彻底删除 `\echo` 改造为纯 SQL,建立统一执行契约文档 | **已解决** | | **REV-02** | **P0 基线** | 缺乏迁移前置环境基线校验,可能在未知或已被破坏的环境中误执行 | [`000_preflight.sql`](file:///Users/wzb/Desktop/项目/RailwaySystem/RuoYi-Vue/sql/train/v2/000_preflight.sql) | 新增前置纯只读检查脚本,强校验当前环境必须精确符合 Phase 0.5 状态(14表、行数、触发器等),任何不符立即抛出异常中止 | **已解决** | | **REV-03** | **P0 备份** | 001 脚本使用 `DROP TABLE IF EXISTS bak_v1_*`,误执行可能覆盖最初 V1 备份 | [`001_backup_current_schema.sql`](file:///Users/wzb/Desktop/项目/RailwaySystem/RuoYi-Vue/sql/train/v2/001_backup_current_schema.sql) | 增加强防重校验,若已存在任意 `bak_v1_*` 表立即抛异常阻断,严禁自动 DROP 覆盖既有历史备份 | **已解决** | | **REV-04** | **P0 回滚** | CTAS 无法保留约束、默认值、触发器和 Identity,不能作为回滚结构来源 | [`rollback/000_phase05_exact_schema.sql`](file:///Users/wzb/Desktop/项目/RailwaySystem/RuoYi-Vue/sql/train/v2/rollback/000_phase05_exact_schema.sql), [`rollback/002`](file:///Users/wzb/Desktop/项目/RailwaySystem/RuoYi-Vue/sql/train/v2/rollback/002_rollback_modified_tables.sql), [`rollback/003`](file:///Users/wzb/Desktop/项目/RailwaySystem/RuoYi-Vue/sql/train/v2/rollback/003_restore_legacy_score.sql) | 新增标准 Phase 0.5 完整物理 DDL;重构回滚脚本,严格基于真实 DDL 重建结构,仅用 `bak_v1_*` 还原数据,解耦结构与数据 | **已解决** | | **REV-05** | **P0 验收** | 010_verify 很多检查仅输出文本,最终未强行阻断,存在假阳性漏报隐患 | [`010_verify.sql`](file:///Users/wzb/Desktop/项目/RailwaySystem/RuoYi-Vue/sql/train/v2/010_verify.sql) | 重构为真正的“失败即失败”,逐表、逐列、逐外键(删除规则)、逐唯一约束、逐索引进行 PL/pgSQL 强断言,出现任何不符立即抛异常终止 | **已解决** | | **REV-06** | **字段规范** | `train_lesson.t_id` 原定义为可空,与排课必要性要求冲突 | [`002_create_new_tables.sql`](file:///Users/wzb/Desktop/项目/RailwaySystem/RuoYi-Vue/sql/train/v2/002_create_new_tables.sql) | 将 `train_lesson.t_id` 设为 `VARCHAR(32) NOT NULL`,并在 010 中强断言 | **已解决** | | **REV-07** | **字段规范** | `train_teacher` 新增的 `status` 与 `del_flag` 未在迁移后固化为 NOT NULL | [`008_migrate_teacher.sql`](file:///Users/wzb/Desktop/项目/RailwaySystem/RuoYi-Vue/sql/train/v2/008_migrate_teacher.sql) | 迁移历史教师数据并完成数据完整性校验后,显式执行 `ALTER COLUMN SET NOT NULL` | **已解决** | | **REV-08** | **字段规范** | `train_student_score.score` 存在未经确认的 `DEFAULT 0`,掩盖未录入状态 | [`002_create_new_tables.sql`](file:///Users/wzb/Desktop/项目/RailwaySystem/RuoYi-Vue/sql/train/v2/002_create_new_tables.sql), [`005_constraints.sql`](file:///Users/wzb/Desktop/项目/RailwaySystem/RuoYi-Vue/sql/train/v2/005_constraints.sql) | 删除 `DEFAULT 0`,保留 `NOT NULL`,增加 `CHECK (score >= 0.00)`;未录成绩不建行,0 分代表真实得分 | **已解决** | | **REV-09** | **字段规范** | 宿舍表 `dorm_floor` 默认值 `'1'` 和 `capacity` 默认值 `4` 属于 AI 猜测 | [`003_alter_master_tables.sql`](file:///Users/wzb/Desktop/项目/RailwaySystem/RuoYi-Vue/sql/train/v2/003_alter_master_tables.sql), [`005_constraints.sql`](file:///Users/wzb/Desktop/项目/RailwaySystem/RuoYi-Vue/sql/train/v2/005_constraints.sql) | 移除所有业务默认值猜测,字段保持 NOT NULL 由管理员录入,增加 `CHECK (capacity > 0)` 约束 | **已解决** | | **REV-10** | **字段规范** | `train_electronic_board.board_name` 包含 `DEFAULT ''` 空串伪造合法值 | [`003_alter_master_tables.sql`](file:///Users/wzb/Desktop/项目/RailwaySystem/RuoYi-Vue/sql/train/v2/003_alter_master_tables.sql) | 彻底移除 `DEFAULT ''`,改为 `VARCHAR(100) NOT NULL`,由用户录入明确设备名 | **已解决** | | **REV-11** | **业务语义** | 学员来源出现“统招学员”等高校概念,两处 `source_type` 含义含糊 | [`002`](file:///Users/wzb/Desktop/项目/RailwaySystem/RuoYi-Vue/sql/train/v2/002_create_new_tables.sql), [`003`](file:///Users/wzb/Desktop/项目/RailwaySystem/RuoYi-Vue/sql/train/v2/003_alter_master_tables.sql), [`007_dicts.sql`](file:///Users/wzb/Desktop/项目/RailwaySystem/RuoYi-Vue/sql/train/v2/007_dicts.sql) | 彻底剥离高校术语,区分:`student.source_type` 为主档来源(管理员/Excel/平台同步);`enrollment.source_type` 为参训名单来源(指派/报名/推荐/调训) | **已解决** | | **REV-12** | **业务语义** | 教学资源类型字典与 V2 冻结稿存在分类差异 | [`002_create_new_tables.sql`](file:///Users/wzb/Desktop/项目/RailwaySystem/RuoYi-Vue/sql/train/v2/002_create_new_tables.sql), [`007_dicts.sql`](file:///Users/wzb/Desktop/项目/RailwaySystem/RuoYi-Vue/sql/train/v2/007_dicts.sql) | 严格对齐 V2 冻结稿:1文档, 2视频, 3 3D模型, 4 VR资源, 5外部教学链接, 6其他 | **已解决** | | **REV-13** | **约束安全** | 学习记录部分唯一索引当 `source_system = NULL` 且 `source_event_id != NULL` 时发生幂等逃逸 | [`004`](file:///Users/wzb/Desktop/项目/RailwaySystem/RuoYi-Vue/sql/train/v2/004_rebuild_business_tables.sql), [`005`](file:///Users/wzb/Desktop/项目/RailwaySystem/RuoYi-Vue/sql/train/v2/005_constraints.sql), [`006_indexes.sql`](file:///Users/wzb/Desktop/项目/RailwaySystem/RuoYi-Vue/sql/train/v2/006_indexes.sql) | 索引条件修正为双非空 `WHERE source_system IS NOT NULL AND source_event_id IS NOT NULL`;增加 CHECK 约束强制单号非空时系统名必填 | **已解决** | | **REV-14** | **依赖解耦** | 脚本滥用 `DROP TABLE ... CASCADE` 掩盖未预期依赖 | [`004`](file:///Users/wzb/Desktop/项目/RailwaySystem/RuoYi-Vue/sql/train/v2/004_rebuild_business_tables.sql), [`009`](file:///Users/wzb/Desktop/项目/RailwaySystem/RuoYi-Vue/sql/train/v2/009_drop_legacy_score.sql), [`rollback`](file:///Users/wzb/Desktop/项目/RailwaySystem/RuoYi-Vue/sql/train/v2/rollback/) | 迁移与回滚脚本全面显式解除已知约束,改用常规 `DROP TABLE`,禁止使用 CASCADE 掩盖隐式依赖 | **已解决** | | **REV-15** | **数据一致** | 排课场地类型与教室/实训场地未在数据库层实现单行互斥;学时时间未核验先后 | [`002`](file:///Users/wzb/Desktop/项目/RailwaySystem/RuoYi-Vue/sql/train/v2/002_create_new_tables.sql), [`004`](file:///Users/wzb/Desktop/项目/RailwaySystem/RuoYi-Vue/sql/train/v2/004_rebuild_business_tables.sql), [`005_constraints.sql`](file:///Users/wzb/Desktop/项目/RailwaySystem/RuoYi-Vue/sql/train/v2/005_constraints.sql) | `train_lesson` 增加 `chk_lesson_venue` 互斥 CHECK;`train_study_duration` 增加 `end_time >= start_time` CHECK 约束 | **已解决** | | **REV-16** | **风险扩展** | 风险报告需要补充跨班级关联、班牌一致性、宿舍重叠计算等高级业务风险 | [`04_risk_review.md`](file:///Users/wzb/Desktop/项目/RailwaySystem/docs/database-v2/04_risk_review.md) | 在文档中新增 **R-11 至 R-15** 五项重大业务与并发一致性风险深度剖析 | **已解决** | | **REV-17** | **执行控制** | 结构迁移阶段执行 007_dicts 会污染空库测试基线 | [`02_migration_plan.md`](file:///Users/wzb/Desktop/项目/RailwaySystem/docs/database-v2/02_migration_plan.md), [`05_execution_contract.md`](file:///Users/wzb/Desktop/项目/RailwaySystem/docs/database-v2/05_execution_contract.md) | 正式明确 007 在本阶段暂不执行,等后续 API/权限设计阶段统一执行 | **已解决** |