58 lines
2.5 KiB
PL/PgSQL
58 lines
2.5 KiB
PL/PgSQL
-- ==============================================================================
|
|
-- 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 -> org_name, t_title -> job_title, create_user -> create_by
|
|
-- 3. 执行后验证迁移完整性,再将 status 与 del_flag 设为 NOT NULL 并安全移除旧列
|
|
-- ==============================================================================
|
|
|
|
BEGIN;
|
|
|
|
-- 步骤 1: 数据平滑映射 (仅更新新字段为空的行,保证幂等)
|
|
UPDATE train_teacher
|
|
SET
|
|
org_name = COALESCE(org_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 org_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;
|