-- ============================================================================== -- RailwaySystem 数据库 V2 迁移脚本: 008_migrate_teacher.sql -- 适用数据库: KingbaseES V009R003C018 (schema: public) -- 执行目标: 迁移并保留 train_teacher 唯一样本数据,完成旧列向新列平滑过渡并安全清理 -- 事务边界: 全程在显式事务 BEGIN ... COMMIT 中执行 -- 设计依据: RailwaySystem 数据库 V2 字段设计与 Kingbase DDL 规范 V1.0 及 Round 1 审查要求 -- 安全规范: -- 1. 严禁在脚本中出现真实教师姓名、电话、身份证、邮箱等明文数据! -- 2. 完全采用纯 DML 数据映射: t_department -> dept_name, t_title -> job_title, create_user -> create_by -- 3. 执行后验证迁移完整性,再将 status 与 del_flag 设为 NOT NULL 并安全移除旧列 -- ============================================================================== BEGIN; -- 步骤 1: 数据平滑映射 (仅更新新字段为空的行,保证幂等) UPDATE train_teacher SET dept_name = COALESCE(dept_name, t_department), job_title = COALESCE(job_title, t_title), create_by = COALESCE(create_by, create_user), status = COALESCE(status, 1), del_flag = COALESCE(del_flag, '0') WHERE t_department IS NOT NULL OR t_title IS NOT NULL OR create_user IS NOT NULL; -- 步骤 2: 校验迁移正确性 (数据行数精确为1,且新字段全部填充完成) DO $$ DECLARE v_total_cnt INT; v_unmigrated_cnt INT; BEGIN SELECT count(*) INTO v_total_cnt FROM train_teacher; SELECT count(*) INTO v_unmigrated_cnt FROM train_teacher WHERE dept_name IS NULL OR status IS NULL OR del_flag IS NULL; IF v_total_cnt <> 1 THEN RAISE EXCEPTION '>>> [008-FATAL] 教师数据校验异常: 期望精确 1 条数据,实际检测到 % 条', v_total_cnt; END IF; IF v_unmigrated_cnt > 0 THEN RAISE EXCEPTION '>>> [008-FATAL] 教师数据迁移失败: 存在 % 条记录的新主档字段尚未正确填充', v_unmigrated_cnt; END IF; RAISE NOTICE '>>> [008-PASS] 教师唯一数据迁移核验通过,准备固化 NOT NULL 约束与清理旧列。'; END $$; -- 步骤 3: 固化新列 NOT NULL 约束 ALTER TABLE train_teacher ALTER COLUMN status SET NOT NULL; ALTER TABLE train_teacher ALTER COLUMN del_flag SET NOT NULL; -- 步骤 4: 安全删除已成功迁移的旧列 (杜绝 CASCADE) ALTER TABLE train_teacher DROP COLUMN IF EXISTS t_department, DROP COLUMN IF EXISTS t_title, DROP COLUMN IF EXISTS create_user; COMMIT;