Files
railwaysystem/RuoYi-Vue/sql/train/v2/008_migrate_teacher.sql
T

57 lines
2.5 KiB
PL/PgSQL
Raw Normal View History

-- ==============================================================================
-- 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;