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();