-- ============================================================================== -- RailwaySystem 数据库 V2 迁移脚本: 003_alter_master_tables.sql -- 适用数据库: KingbaseES V009R003C018 (schema: public) -- 执行目标: 调整 8 张主数据表结构至 V2 规范模型 -- 事务边界: 全程在显式事务 BEGIN ... COMMIT 中执行 -- 设计依据: RailwaySystem 数据库 V2 字段设计与 Kingbase DDL 规范 V1.0 及 Round 1 审查要求 -- 包含表: -- 1. train_teacher (保留1行数据,先加新列,旧列待008迁移并校验后设NOT NULL并删除旧列) -- 2. train_student (0行,删除高校学籍旧列,增加企业主档与加密列,规范source_type语义) -- 3. train_course (0行,删除旧附件字段,增加课程编码与审计列) -- 4. train_classroom_info (0行,对齐公共审计字段) -- 5. train_training_site (0行,对齐公共审计字段) -- 6. train_electronic_board (0行,解绑计划ID,board_name 必填无默认空串) -- 7. train_dormitory_info (0行,重构为容量与性别属性,删除预测默认值,增加 capacity > 0 CHECK) -- 8. train_class_plan (0行,解绑单课程c_id与单教师t_id,升级为多课程架构) -- ============================================================================== BEGIN; -- ============================================================================== -- 步骤 1: 移除主数据表上绑定的旧 update_time 触发器 -- ============================================================================== DROP TRIGGER IF EXISTS trig_train_teacher_modify ON train_teacher; DROP TRIGGER IF EXISTS trig_train_student_modify ON train_student; DROP TRIGGER IF EXISTS trig_train_course_modify ON train_course; DROP TRIGGER IF EXISTS trig_train_classroom_modify ON train_classroom_info; DROP TRIGGER IF EXISTS trig_train_trainsite_modify ON train_training_site; DROP TRIGGER IF EXISTS trig_train_board_modify ON train_electronic_board; DROP TRIGGER IF EXISTS trig_train_dorminfo_modify ON train_dormitory_info; DROP TRIGGER IF EXISTS trig_train_classplan_modify ON train_class_plan; -- ============================================================================== -- 步骤 2: 显式解除阻塞主数据列删除或变更的旧外键约束 (不使用 CASCADE) -- ============================================================================== -- train_class_plan 上的旧外键 (指向 train_course 和 train_teacher) ALTER TABLE train_class_plan DROP CONSTRAINT IF EXISTS fk_classplan_course; ALTER TABLE train_class_plan DROP CONSTRAINT IF EXISTS fk_classplan_teacher; -- train_electronic_board 上的旧外键 (指向 train_class_plan) ALTER TABLE train_electronic_board DROP CONSTRAINT IF EXISTS fk_board_plan; -- ============================================================================== -- 步骤 3: 调整 train_teacher (有 1 行真实数据,暂不删除旧列,留待 008 迁移数据) -- ============================================================================== ALTER TABLE train_teacher ADD COLUMN user_id BIGINT, ADD COLUMN org_name VARCHAR(100), ADD COLUMN job_title VARCHAR(50), ADD COLUMN status SMALLINT DEFAULT 1, ADD COLUMN create_by VARCHAR(64), ADD COLUMN update_by VARCHAR(64), ADD COLUMN del_flag CHAR(1) DEFAULT '0'; ALTER TABLE train_teacher ALTER COLUMN t_name TYPE VARCHAR(50), ALTER COLUMN t_gender TYPE CHAR(1), ALTER COLUMN t_email TYPE VARCHAR(100), ALTER COLUMN remark TYPE VARCHAR(500); COMMENT ON COLUMN train_teacher.user_id IS 'sys_user登录账号逻辑关联ID'; COMMENT ON COLUMN train_teacher.org_name IS '所属单位/部门名称 (由旧 t_department 迁移)'; COMMENT ON COLUMN train_teacher.job_title IS '职务/职称 (由旧 t_title 迁移)'; COMMENT ON COLUMN train_teacher.status IS '状态 (1:正常, 0:停用)'; COMMENT ON COLUMN train_teacher.del_flag IS '删除标志 (0:存在, 2:删除)'; -- ============================================================================== -- 步骤 4: 调整 train_student (当前 0 行) -- ============================================================================== -- 4.1 淘汰高校模式旧字段与旧审计字段 ALTER TABLE train_student DROP COLUMN IF EXISTS s_department, DROP COLUMN IF EXISTS s_major, DROP COLUMN IF EXISTS s_class, DROP COLUMN IF EXISTS create_user; -- 4.2 增加企业培训新主档字段、加密字段与公共审计字段 ALTER TABLE train_student ADD COLUMN user_id BIGINT, ADD COLUMN org_name VARCHAR(100), ADD COLUMN s_email VARCHAR(100), ADD COLUMN id_card_ciphertext TEXT, ADD COLUMN id_card_hash VARCHAR(128), ADD COLUMN id_card_last4 VARCHAR(4), ADD COLUMN face_ref VARCHAR(255), ADD COLUMN source_type SMALLINT DEFAULT 1 NOT NULL, ADD COLUMN status SMALLINT DEFAULT 1 NOT NULL, ADD COLUMN create_by VARCHAR(64), ADD COLUMN update_by VARCHAR(64), ADD COLUMN del_flag CHAR(1) DEFAULT '0' NOT NULL; ALTER TABLE train_student ALTER COLUMN s_name TYPE VARCHAR(50), ALTER COLUMN s_gender TYPE CHAR(1), ALTER COLUMN remark TYPE VARCHAR(500); COMMENT ON COLUMN train_student.user_id IS 'sys_user账号逻辑关联'; COMMENT ON COLUMN train_student.org_name IS '所属单位/部门'; COMMENT ON COLUMN train_student.id_card_ciphertext IS '身份证可逆加密密文'; COMMENT ON COLUMN train_student.id_card_hash IS '身份证精确匹配Hash (防重)'; COMMENT ON COLUMN train_student.id_card_last4 IS '身份证后四位展示'; COMMENT ON COLUMN train_student.face_ref IS '人脸特征或图像凭证引用'; COMMENT ON COLUMN train_student.source_type IS '人员主档进入系统的来源 (1:管理员录入, 2:Excel批量导入, 3:铁路内部业务平台同步)'; COMMENT ON COLUMN train_student.status IS '主档状态 (1:正常, 0:停用)'; COMMENT ON COLUMN train_student.del_flag IS '删除标志 (0:存在, 2:删除)'; -- ============================================================================== -- 步骤 5: 调整 train_course (当前 0 行) -- ============================================================================== -- 5.1 淘汰旧集中附件字段 (已解耦迁入 train_resource 与 train_course_resource) ALTER TABLE train_course DROP COLUMN IF EXISTS attach_doc, DROP COLUMN IF EXISTS attach_video, DROP COLUMN IF EXISTS attach_model_link, DROP COLUMN IF EXISTS model_resource_ids, DROP COLUMN IF EXISTS create_user; -- 5.2 增加课程编码与标准审计字段 ALTER TABLE train_course ADD COLUMN c_code VARCHAR(50), ADD COLUMN status SMALLINT DEFAULT 1 NOT NULL, ADD COLUMN create_by VARCHAR(64), ADD COLUMN update_by VARCHAR(64), ADD COLUMN del_flag CHAR(1) DEFAULT '0' NOT NULL; ALTER TABLE train_course ALTER COLUMN remark TYPE VARCHAR(500); COMMENT ON COLUMN train_course.c_code IS '课程统一业务编码'; COMMENT ON COLUMN train_course.status IS '课程状态 (1:正常, 0:停用)'; COMMENT ON COLUMN train_course.del_flag IS '删除标志 (0:存在, 2:删除)'; -- ============================================================================== -- 步骤 6: 调整 train_classroom_info (当前 0 行) -- ============================================================================== ALTER TABLE train_classroom_info DROP COLUMN IF EXISTS create_user; ALTER TABLE train_classroom_info ADD COLUMN create_by VARCHAR(64), ADD COLUMN update_by VARCHAR(64), ADD COLUMN del_flag CHAR(1) DEFAULT '0' NOT NULL; ALTER TABLE train_classroom_info ALTER COLUMN remark TYPE VARCHAR(500), ALTER COLUMN room_status SET NOT NULL; COMMENT ON COLUMN train_classroom_info.del_flag IS '删除标志 (0:存在, 2:删除)'; -- ============================================================================== -- 步骤 7: 调整 train_training_site (当前 0 行) -- ============================================================================== ALTER TABLE train_training_site DROP COLUMN IF EXISTS create_user; ALTER TABLE train_training_site ADD COLUMN create_by VARCHAR(64), ADD COLUMN update_by VARCHAR(64), ADD COLUMN del_flag CHAR(1) DEFAULT '0' NOT NULL; ALTER TABLE train_training_site ALTER COLUMN remark TYPE VARCHAR(500), ALTER COLUMN site_status SET NOT NULL; COMMENT ON COLUMN train_training_site.del_flag IS '删除标志 (0:存在, 2:删除)'; -- ============================================================================== -- 步骤 8: 调整 train_electronic_board (当前 0 行) -- ============================================================================== -- 8.1 移除计划绑定列与旧播放字段 ALTER TABLE train_electronic_board DROP COLUMN IF EXISTS bind_plan_id, DROP COLUMN IF EXISTS board_content, DROP COLUMN IF EXISTS board_playmode, DROP COLUMN IF EXISTS create_user; -- 8.2 增加设备名称 (必填,严禁空串默认)、API端点与审计字段 ALTER TABLE train_electronic_board ADD COLUMN board_name VARCHAR(100) NOT NULL, ADD COLUMN api_endpoint VARCHAR(255), ADD COLUMN create_by VARCHAR(64), ADD COLUMN update_by VARCHAR(64), ADD COLUMN del_flag CHAR(1) DEFAULT '0' NOT NULL; ALTER TABLE train_electronic_board ALTER COLUMN support_checkin_type TYPE VARCHAR(50), ALTER COLUMN remark TYPE VARCHAR(500), ALTER COLUMN board_status SET NOT NULL; COMMENT ON COLUMN train_electronic_board.board_name IS '电子班牌名称 (必填)'; COMMENT ON COLUMN train_electronic_board.api_endpoint IS '设备交互/推送接口地址'; COMMENT ON COLUMN train_electronic_board.bind_classroom_id IS '绑定的物理教室ID'; COMMENT ON COLUMN train_electronic_board.del_flag IS '删除标志 (0:存在, 2:删除)'; -- ============================================================================== -- 步骤 9: 调整 train_dormitory_info (当前 0 行) -- ============================================================================== -- 9.1 移除静态床位统计列 ALTER TABLE train_dormitory_info DROP COLUMN IF EXISTS bed_total, DROP COLUMN IF EXISTS bed_used, DROP COLUMN IF EXISTS create_user; -- 9.2 增加楼层、房间额定容量、适用性别 (杜绝业务默认值猜测,增加容量正数 CHECK) ALTER TABLE train_dormitory_info ADD COLUMN dorm_floor VARCHAR(20) NOT NULL, ADD COLUMN capacity INTEGER NOT NULL, ADD COLUMN gender_type SMALLINT DEFAULT 0 NOT NULL, ADD COLUMN create_by VARCHAR(64), ADD COLUMN update_by VARCHAR(64), ADD COLUMN del_flag CHAR(1) DEFAULT '0' NOT NULL; ALTER TABLE train_dormitory_info ALTER COLUMN dorm_building SET NOT NULL, ALTER COLUMN dorm_room SET NOT NULL, ALTER COLUMN remark TYPE VARCHAR(500), ALTER COLUMN dorm_status SET NOT NULL; ALTER TABLE train_dormitory_info DROP CONSTRAINT IF EXISTS chk_dorm_capacity; ALTER TABLE train_dormitory_info ADD CONSTRAINT chk_dorm_capacity CHECK (capacity > 0); COMMENT ON COLUMN train_dormitory_info.dorm_floor IS '所在楼层 (管理员真实录入)'; COMMENT ON COLUMN train_dormitory_info.capacity IS '房间核定床位容量 (正整数,无默认值)'; COMMENT ON COLUMN train_dormitory_info.gender_type IS '适用性别 (0:不限, 1:男, 2:女)'; COMMENT ON COLUMN train_dormitory_info.del_flag IS '删除标志 (0:存在, 2:删除)'; -- ============================================================================== -- 步骤 10: 调整 train_class_plan (当前 0 行) -- ============================================================================== -- 10.1 彻底剥离旧单课 c_id 和旧单教师 t_id ALTER TABLE train_class_plan DROP COLUMN IF EXISTS c_id, DROP COLUMN IF EXISTS t_id, DROP COLUMN IF EXISTS create_user; -- 10.2 增加报到截止时间与标准审计列 ALTER TABLE train_class_plan ADD COLUMN report_deadline TIMESTAMP, ADD COLUMN create_by VARCHAR(64), ADD COLUMN update_by VARCHAR(64), ADD COLUMN del_flag CHAR(1) DEFAULT '0' NOT NULL; ALTER TABLE train_class_plan ALTER COLUMN plan_name TYPE VARCHAR(150), ALTER COLUMN train_address TYPE VARCHAR(200), ALTER COLUMN remark TYPE VARCHAR(500), ALTER COLUMN plan_status SET NOT NULL; COMMENT ON COLUMN train_class_plan.report_deadline IS '学员现场报到截止时间'; COMMENT ON COLUMN train_class_plan.del_flag IS '删除标志 (0:存在, 2:删除)'; COMMIT;