-- ============================================================================== -- RailwaySystem 数据库 V2 迁移脚本: 001_backup_current_schema.sql -- 适用数据库: KingbaseES V009R003C018 (schema: public) -- 执行目标: 备份当前 14 张培训旧表的数据与列结构快照 -- 事务边界: 全程在显式事务 BEGIN ... COMMIT 中执行 -- 安全原则: -- 1. 禁止覆盖已有备份: 执行前检查若存在任意 bak_v1_* 表,立即抛出 EXCEPTION 强行阻断 -- 2. 严禁使用 DROP TABLE IF EXISTS bak_v1_* 自动抹除已有备份 -- 3. 严禁触碰任何 sys_* 系统表 -- 4. 说明: CREATE TABLE AS SELECT 在 KingbaseES 中仅复制列名、类型与数据, -- 不承担完整 DDL 快照职责 (完整结构备份由 rollback/000_phase05_exact_schema.sql 承担) -- ============================================================================== BEGIN; -- 步骤 1: 强防重与防覆盖检查 (杜绝二次执行覆盖原始 V1 快照) DO $$ DECLARE v_bak_cnt INT; v_existing_baks TEXT := ''; r RECORD; BEGIN FOR r IN ( SELECT table_name FROM information_schema.tables WHERE table_schema = current_schema() AND table_name LIKE 'bak_v1_%' ) LOOP v_existing_baks := v_existing_baks || r.table_name || ', '; END LOOP; IF v_existing_baks <> '' THEN RAISE EXCEPTION '>>> [001-FATAL] 检测到既有备份表已经存在: [%]。为防止意外覆盖真实 V1 历史数据,严禁重复执行 001 备份!如需重新备份,请由 DBA 手动确认后归档清理既有 bak_v1_* 表。', v_existing_baks; END IF; END $$; -- 步骤 2: 备份具备真实数据的核心主数据表: train_teacher (当前环境精确 1 行) CREATE TABLE bak_v1_train_teacher AS SELECT * FROM train_teacher; COMMENT ON TABLE bak_v1_train_teacher IS 'Phase 0.5 历史备份: 教师主档 (含唯一真实数据)'; -- 步骤 3: 备份其余 13 张现有空表 (当前行数均为 0,备份数据与字段基线) CREATE TABLE bak_v1_train_student AS SELECT * FROM train_student; COMMENT ON TABLE bak_v1_train_student IS 'Phase 0.5 历史备份: 学员表快照'; CREATE TABLE bak_v1_train_course AS SELECT * FROM train_course; COMMENT ON TABLE bak_v1_train_course IS 'Phase 0.5 历史备份: 课程表快照'; CREATE TABLE bak_v1_train_class_plan AS SELECT * FROM train_class_plan; COMMENT ON TABLE bak_v1_train_class_plan IS 'Phase 0.5 历史备份: 开班计划快照'; CREATE TABLE bak_v1_train_dormitory_info AS SELECT * FROM train_dormitory_info; COMMENT ON TABLE bak_v1_train_dormitory_info IS 'Phase 0.5 历史备份: 宿舍信息快照'; CREATE TABLE bak_v1_train_dorm_auth AS SELECT * FROM train_dorm_auth; COMMENT ON TABLE bak_v1_train_dorm_auth IS 'Phase 0.5 历史备份: 宿舍门禁快照'; CREATE TABLE bak_v1_train_classroom_info AS SELECT * FROM train_classroom_info; COMMENT ON TABLE bak_v1_train_classroom_info IS 'Phase 0.5 历史备份: 教室信息快照'; CREATE TABLE bak_v1_train_training_site AS SELECT * FROM train_training_site; COMMENT ON TABLE bak_v1_train_training_site IS 'Phase 0.5 历史备份: 实训场地快照'; CREATE TABLE bak_v1_train_class_report AS SELECT * FROM train_class_report; COMMENT ON TABLE bak_v1_train_class_report IS 'Phase 0.5 历史备份: 报到记录快照'; CREATE TABLE bak_v1_train_electronic_board AS SELECT * FROM train_electronic_board; COMMENT ON TABLE bak_v1_train_electronic_board IS 'Phase 0.5 历史备份: 电子班牌快照'; CREATE TABLE bak_v1_train_student_checkin AS SELECT * FROM train_student_checkin; COMMENT ON TABLE bak_v1_train_student_checkin IS 'Phase 0.5 历史备份: 考勤签到快照'; CREATE TABLE bak_v1_train_score_info AS SELECT * FROM train_score_info; COMMENT ON TABLE bak_v1_train_score_info IS 'Phase 0.5 历史备份: 旧成绩表快照 (待淘汰)'; CREATE TABLE bak_v1_train_study_duration AS SELECT * FROM train_study_duration; COMMENT ON TABLE bak_v1_train_study_duration IS 'Phase 0.5 历史备份: 学习时长快照'; CREATE TABLE bak_v1_train_student_portrait AS SELECT * FROM train_student_portrait; COMMENT ON TABLE bak_v1_train_student_portrait IS 'Phase 0.5 历史备份: 学员画像快照'; -- 步骤 4: 校验备份完整性 DO $$ DECLARE v_teacher_cnt INT; v_bak_total INT; BEGIN SELECT count(*) INTO v_teacher_cnt FROM bak_v1_train_teacher; IF v_teacher_cnt <> 1 THEN RAISE EXCEPTION '>>> [001-FATAL] 备份校验失败: bak_v1_train_teacher 期望 1 条数据,实际为 % 条', v_teacher_cnt; END IF; SELECT count(*) INTO v_bak_total FROM information_schema.tables WHERE table_schema = current_schema() AND table_name LIKE 'bak_v1_%'; IF v_bak_total <> 14 THEN RAISE EXCEPTION '>>> [001-FATAL] 备份表总数异常: 期望 14 张备份表,实际生成 % 张', v_bak_total; END IF; RAISE NOTICE '>>> [001-PASS] 14 张表快照备份全部完成,教师唯一真实数据已安全封存。'; END $$; COMMIT;