整理迁移:移除错误全局床位唯一约束并强化015断言
This commit is contained in:
1 parent
0a637bfbbc
commit
614908d674
1 file changed
+17
-47
@@ -1,8 +1,8 @@
|
||||
-- ============================================================================
|
||||
-- Migration: 015_dms_package_a_hardening.sql
|
||||
-- Description: Package A.1 DMS 一致性加固与最小权限拆分
|
||||
-- 1. 权限最小化拆分:新增 2194 (train:access:credential),从 train_admin 移除 2192 (train:access:manage)
|
||||
-- 2. 床位唯一性约束:检测无重复记录时创建有效床位部分唯一索引
|
||||
-- 1. 权限最小化拆分:新增 2194 (train:access:credential),从 train_admin 移除 2192 (train:access:manage) 与 2263 (train:accommodation:remove)
|
||||
-- 2. 外部操作状态加固:确保 train_external_operation 支持 DISPATCHING 与 AMBIGUOUS
|
||||
-- 3. 幂等与断言校验
|
||||
-- ============================================================================
|
||||
|
||||
@@ -37,55 +37,14 @@ WHERE role_id = 3 AND menu_id = 2192;
|
||||
DELETE FROM public.sys_role_menu
|
||||
WHERE role_id = 3 AND menu_id = 2263;
|
||||
|
||||
-- 4. 有效床位唯一性约束 (Section 17)
|
||||
-- 先只读检查是否存在已有的活跃床位重复数据
|
||||
DO $$
|
||||
DECLARE
|
||||
v_dup_groups INTEGER;
|
||||
BEGIN
|
||||
SELECT COUNT(*) INTO v_dup_groups FROM (
|
||||
SELECT dorm_id, bed_no
|
||||
FROM train_accommodation
|
||||
WHERE accommodation_status IN (0, 1)
|
||||
AND bed_no IS NOT NULL
|
||||
GROUP BY dorm_id, bed_no
|
||||
HAVING COUNT(*) > 1
|
||||
) t;
|
||||
|
||||
IF v_dup_groups = 0 THEN
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM pg_class c
|
||||
JOIN pg_namespace n ON n.oid = c.relnamespace
|
||||
WHERE c.relname = 'idx_train_acc_dorm_bed_active_uniq'
|
||||
) THEN
|
||||
CREATE UNIQUE INDEX idx_train_acc_dorm_bed_active_uniq
|
||||
ON train_accommodation (dorm_id, bed_no)
|
||||
WHERE accommodation_status IN (0, 1) AND bed_no IS NOT NULL;
|
||||
RAISE NOTICE 'Created partial unique index idx_train_acc_dorm_bed_active_uniq successfully.';
|
||||
END IF;
|
||||
ELSE
|
||||
RAISE NOTICE 'ACTIVE_BED_DUPLICATE_GROUP_COUNT = %, skipping unique index creation to prevent business data destruction.', v_dup_groups;
|
||||
END IF;
|
||||
END $$;
|
||||
|
||||
-- 5. 状态机约束兼容性检查 (train_external_operation)
|
||||
-- 5. 状态机约束兼容性加固 (train_external_operation)
|
||||
-- 确保 operation_status 允许 DISPATCHING 与 AMBIGUOUS
|
||||
DO $$
|
||||
DECLARE
|
||||
v_conname TEXT;
|
||||
BEGIN
|
||||
SELECT conname INTO v_conname
|
||||
FROM pg_constraint
|
||||
WHERE conrelid = 'train_external_operation'::regclass
|
||||
AND contype = 'c'
|
||||
AND pg_get_constraintdef(oid) LIKE '%operation_status%';
|
||||
ALTER TABLE train_external_operation DROP CONSTRAINT IF EXISTS chk_external_operation_status;
|
||||
|
||||
IF v_conname IS NOT NULL THEN
|
||||
EXECUTE 'ALTER TABLE train_external_operation DROP CONSTRAINT ' || quote_ident(v_conname);
|
||||
EXECUTE 'ALTER TABLE train_external_operation ADD CONSTRAINT chk_external_operation_status ' ||
|
||||
'CHECK (operation_status IN (''CREATED'',''DISPATCHING'',''REQUESTED'',''ACCEPTED'',''PENDING'',''RETRY_WAIT'',''AMBIGUOUS'',''SUCCESS'',''FAILED'',''TIMEOUT''))';
|
||||
END IF;
|
||||
END $$;
|
||||
ALTER TABLE train_external_operation ADD CONSTRAINT chk_external_operation_status
|
||||
CHECK (operation_status IN ('CREATED','DISPATCHING','REQUESTED','ACCEPTED','PENDING','RETRY_WAIT','AMBIGUOUS','SUCCESS','FAILED','TIMEOUT'));
|
||||
|
||||
-- 6. 后置断言验证
|
||||
DO $$
|
||||
@@ -114,6 +73,17 @@ BEGIN
|
||||
IF (SELECT count(*) FROM public.sys_role_menu WHERE role_id = 3 AND menu_id = 2264) <> 1 THEN
|
||||
RAISE EXCEPTION 'Assertion failed: role 3 missing menu 2264 (train:accommodation:add)';
|
||||
END IF;
|
||||
|
||||
-- 断言 6: operation_status CHECK 约束已生效且包含 DISPATCHING 与 AMBIGUOUS
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM pg_constraint
|
||||
WHERE conrelid = 'train_external_operation'::regclass
|
||||
AND contype = 'c'
|
||||
AND pg_get_constraintdef(oid) LIKE '%DISPATCHING%'
|
||||
AND pg_get_constraintdef(oid) LIKE '%AMBIGUOUS%'
|
||||
) THEN
|
||||
RAISE EXCEPTION 'Assertion failed: operation_status constraint invalid or missing DISPATCHING/AMBIGUOUS';
|
||||
END IF;
|
||||
END $$;
|
||||
|
||||
COMMIT;
|
||||
Reference in new issue
Block a user