SET search_path TO atlas, public; -- 审核通过的规则只能由新版本替代;应用角色不能直接修改已经用于报价的运价。 CREATE FUNCTION guard_reviewed_logistics_mutation() RETURNS trigger LANGUAGE plpgsql SET search_path = atlas, public AS $$ DECLARE card_id UUID; BEGIN IF TG_TABLE_NAME='logistics_rate_cards' THEN card_id := OLD.id; ELSIF TG_TABLE_NAME IN ('logistics_product_types','logistics_transport_methods') THEN IF TG_OP='DELETE' THEN card_id := OLD.rate_card_id; ELSE card_id := NEW.rate_card_id; END IF; ELSE IF TG_OP='DELETE' THEN SELECT rate_card_id INTO card_id FROM logistics_product_types WHERE id=OLD.product_type_id; ELSE SELECT rate_card_id INTO card_id FROM logistics_product_types WHERE id=NEW.product_type_id; END IF; END IF; IF card_id IS NOT NULL THEN PERFORM 1 FROM logistics_rate_cards WHERE id=card_id FOR SHARE; IF EXISTS (SELECT 1 FROM logistics_rate_card_reviews WHERE rate_card_id=card_id) THEN RAISE EXCEPTION '已审核的物流费率不可改写,请建立新版本' USING ERRCODE='23514'; END IF; END IF; IF TG_OP='DELETE' THEN RETURN OLD; END IF; RETURN NEW; END $$; CREATE TRIGGER reviewed_card_immutable BEFORE UPDATE OR DELETE ON logistics_rate_cards FOR EACH ROW EXECUTE FUNCTION guard_reviewed_logistics_mutation(); CREATE TRIGGER reviewed_type_immutable BEFORE INSERT OR UPDATE OR DELETE ON logistics_product_types FOR EACH ROW EXECUTE FUNCTION guard_reviewed_logistics_mutation(); CREATE TRIGGER reviewed_method_immutable BEFORE INSERT OR UPDATE OR DELETE ON logistics_transport_methods FOR EACH ROW EXECUTE FUNCTION guard_reviewed_logistics_mutation(); CREATE TRIGGER reviewed_rule_immutable BEFORE INSERT OR UPDATE OR DELETE ON logistics_rate_rules FOR EACH ROW EXECUTE FUNCTION guard_reviewed_logistics_mutation();