49 lines
2.2 KiB
PL/PgSQL
49 lines
2.2 KiB
PL/PgSQL
-- =============================================================================
|
|
-- 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;
|