SET search_path TO atlas, public; -- 固定函数查找路径,业务连接不依赖迁移会话的 search_path。 ALTER FUNCTION invalidate_variant_pricing() SET search_path = atlas, public; -- 防止数据库绕过接口拼接其他费率卡的运输规则。 CREATE FUNCTION check_pricing_transport_card() RETURNS trigger LANGUAGE plpgsql SET search_path = atlas, public AS $$ BEGIN IF TG_TABLE_NAME='logistics_rate_rules' THEN IF NOT EXISTS (SELECT 1 FROM logistics_product_types p JOIN logistics_transport_methods t ON t.rate_card_id=p.rate_card_id WHERE p.id=NEW.product_type_id AND t.id=NEW.transport_method_id) THEN RAISE EXCEPTION '物流类型和运输方式必须属于同一费率卡' USING ERRCODE='23514'; END IF; ELSIF TG_TABLE_NAME='pricing_policies' THEN IF NEW.default_transport_method_id IS NOT NULL AND NOT EXISTS(SELECT 1 FROM logistics_transport_methods WHERE id=NEW.default_transport_method_id AND rate_card_id=NEW.rate_card_id) THEN RAISE EXCEPTION '方案默认运输方式必须属于费率卡' USING ERRCODE='23514'; END IF; ELSE IF NOT EXISTS(SELECT 1 FROM pricing_policies p JOIN logistics_transport_methods t ON t.rate_card_id=p.rate_card_id WHERE p.id=NEW.pricing_policy_id AND p.workspace_id=NEW.workspace_id AND t.id=NEW.transport_method_id) THEN RAISE EXCEPTION '方案比较方式必须属于费率卡' USING ERRCODE='23514'; END IF; END IF; RETURN NEW; END $$; CREATE CONSTRAINT TRIGGER logistics_transport_card AFTER INSERT OR UPDATE ON logistics_rate_rules DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION check_pricing_transport_card(); CREATE CONSTRAINT TRIGGER policy_transport_card AFTER INSERT OR UPDATE ON pricing_policies DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION check_pricing_transport_card(); CREATE CONSTRAINT TRIGGER policy_comparison_card AFTER INSERT OR UPDATE ON pricing_policy_transport_methods DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION check_pricing_transport_card();