Files
railwaysystem/RuoYi-Vue/sql/train/v2/001_backup_current_schema.sql
T

103 lines
4.9 KiB
PL/PgSQL
Raw Normal View History

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