Files
atlas-seller-kit/packages/database/migrations/051_reviewed_logistics_scope_guard.sql
T
2026-09-28 17:34:33 +08:00

32 lines
1.5 KiB
PL/PgSQL

SET search_path TO atlas, public;
-- 更新规则归属时同时检查原费率卡和目标费率卡,避免把已审核规则移出后改写。
CREATE OR REPLACE FUNCTION guard_reviewed_logistics_mutation() RETURNS trigger LANGUAGE plpgsql SET search_path = atlas, public AS $$
DECLARE
old_card_id UUID;
new_card_id UUID;
current_card_id UUID;
BEGIN
IF TG_TABLE_NAME='logistics_rate_cards' THEN
old_card_id := OLD.id;
ELSIF TG_TABLE_NAME IN ('logistics_product_types','logistics_transport_methods') THEN
IF TG_OP<>'INSERT' THEN old_card_id := OLD.rate_card_id; END IF;
IF TG_OP<>'DELETE' THEN new_card_id := NEW.rate_card_id; END IF;
ELSE
IF TG_OP<>'INSERT' THEN
SELECT rate_card_id INTO old_card_id FROM logistics_product_types WHERE id=OLD.product_type_id;
END IF;
IF TG_OP<>'DELETE' THEN
SELECT rate_card_id INTO new_card_id FROM logistics_product_types WHERE id=NEW.product_type_id;
END IF;
END IF;
FOR current_card_id IN SELECT DISTINCT id FROM (VALUES(old_card_id),(new_card_id)) AS ids(id) WHERE id IS NOT NULL LOOP
PERFORM 1 FROM logistics_rate_cards WHERE id=current_card_id FOR SHARE;
IF EXISTS (SELECT 1 FROM logistics_rate_card_reviews WHERE rate_card_id=current_card_id) THEN
RAISE EXCEPTION '已审核的物流费率不可改写,请建立新版本' USING ERRCODE='23514';
END IF;
END LOOP;
IF TG_OP='DELETE' THEN RETURN OLD; END IF;
RETURN NEW;
END $$;