Files
geMoldInsight/scripts/db/001_freeze_delivered_sales_orders.sql
T
2026-03-25 23:59:29 +08:00

57 lines
1.4 KiB
PL/PgSQL

DO $$
BEGIN
IF NOT EXISTS (SELECT 1 FROM pg_language WHERE lanname = 'plpgsql') THEN
CREATE LANGUAGE plpgsql;
END IF;
END $$;
CREATE OR REPLACE FUNCTION trg_block_delivered_sales_orders_head()
RETURNS trigger
LANGUAGE plpgsql
AS $$
BEGIN
IF OLD.status = 'delivered' THEN
RAISE EXCEPTION '已交付的销售订单禁止修改或删除';
END IF;
IF TG_OP = 'DELETE' THEN
RETURN OLD;
END IF;
RETURN NEW;
END;
$$;
DROP TRIGGER IF EXISTS block_delivered_sales_orders_head ON sales_orders;
CREATE TRIGGER block_delivered_sales_orders_head
BEFORE UPDATE OR DELETE ON sales_orders
FOR EACH ROW
EXECUTE FUNCTION trg_block_delivered_sales_orders_head();
CREATE OR REPLACE FUNCTION trg_block_delivered_sales_orders_items()
RETURNS trigger
LANGUAGE plpgsql
AS $$
DECLARE
v_status text;
BEGIN
SELECT status INTO v_status
FROM sales_orders
WHERE id = COALESCE(NEW.order_id, OLD.order_id);
IF v_status = 'delivered' THEN
RAISE EXCEPTION '已交付的销售订单明细禁止变更';
END IF;
IF TG_OP = 'DELETE' THEN
RETURN OLD;
END IF;
RETURN NEW;
END;
$$;
DROP TRIGGER IF EXISTS block_delivered_sales_orders_items ON sales_order_items;
CREATE TRIGGER block_delivered_sales_orders_items
BEFORE INSERT OR UPDATE OR DELETE ON sales_order_items
FOR EACH ROW
EXECUTE FUNCTION trg_block_delivered_sales_orders_items();