-- ============================================================================= -- RailwaySystem 数据库 RBAC 迁移脚本: 004_rbac_identity_binding.sql -- 适用数据库: KingbaseES V009R003C018 (schema: public) -- 执行目标: 建立 sys_user 与业务主体(教师/学员)物理约束与部分唯一索引 -- 事务边界: 全程在显式事务 BEGIN ... COMMIT 中执行 -- 幂等保证: 仅使用 ADD COLUMN IF NOT EXISTS 与 CREATE INDEX IF NOT EXISTS,严禁 DROP / TRUNCATE -- 设计依据: docs/development/rbac-r2/01_identity_binding_design.md 及 06_migration_plan.md -- ============================================================================= BEGIN; -- 步骤 1: 确保 user_id 列存在 (幂等容错,已存在则静默跳过) ALTER TABLE train_teacher ADD COLUMN IF NOT EXISTS user_id BIGINT; ALTER TABLE train_student ADD COLUMN IF NOT EXISTS user_id BIGINT; -- 步骤 2: 建立教师账号部分唯一索引 (无 DROP,幂等容错,忽略已删除 del_flag='2' 与空值) CREATE UNIQUE INDEX IF NOT EXISTS uq_train_teacher_user_id ON train_teacher(user_id) WHERE user_id IS NOT NULL AND del_flag = '0'; -- 步骤 3: 建立学员账号部分唯一索引 (无 DROP,幂等容错,忽略已删除 del_flag='2' 与空值) CREATE UNIQUE INDEX IF NOT EXISTS uq_train_student_user_id ON train_student(user_id) WHERE user_id IS NOT NULL AND del_flag = '0'; -- 步骤 4: 更新字段元数据注释 COMMENT ON COLUMN train_teacher.user_id IS '关联sys_user.user_id (唯一绑定教师登录账号)'; COMMENT ON COLUMN train_student.user_id IS '关联sys_user.user_id (唯一绑定学员登录账号)'; -- 步骤 5: 迁移完整性校验 DO $$ BEGIN IF NOT EXISTS ( SELECT 1 FROM pg_indexes WHERE tablename = 'train_teacher' AND indexname = 'uq_train_teacher_user_id' ) THEN RAISE EXCEPTION 'uq_train_teacher_user_id partial unique index creation failed'; END IF; IF NOT EXISTS ( SELECT 1 FROM pg_indexes WHERE tablename = 'train_student' AND indexname = 'uq_train_student_user_id' ) THEN RAISE EXCEPTION 'uq_train_student_user_id partial unique index creation failed'; END IF; END $$; COMMIT;