From 614908d674976cfb090c54d3d62982c1b1090d3e Mon Sep 17 00:00:00 2001 From: wangzhibiao Date: Mon, 21 Sep 2026 16:14:07 +0800 Subject: [PATCH] =?UTF-8?q?=E6=95=B4=E7=90=86=E8=BF=81=E7=A7=BB=EF=BC=9A?= =?UTF-8?q?=E7=A7=BB=E9=99=A4=E9=94=99=E8=AF=AF=E5=85=A8=E5=B1=80=E5=BA=8A?= =?UTF-8?q?=E4=BD=8D=E5=94=AF=E4=B8=80=E7=BA=A6=E6=9D=9F=E5=B9=B6=E5=BC=BA?= =?UTF-8?q?=E5=8C=96015=E6=96=AD=E8=A8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kingbase/015_dms_package_a_hardening.sql | 64 +++++-------------- 1 file changed, 17 insertions(+), 47 deletions(-) diff --git a/RuoYi-Vue/sql/system/kingbase/015_dms_package_a_hardening.sql b/RuoYi-Vue/sql/system/kingbase/015_dms_package_a_hardening.sql index 3695a67d6..1c7f8ed68 100644 --- a/RuoYi-Vue/sql/system/kingbase/015_dms_package_a_hardening.sql +++ b/RuoYi-Vue/sql/system/kingbase/015_dms_package_a_hardening.sql @@ -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;