规则系统再造:用重写规则实现轻量级数据分发
PostgreSQL的规则系统(RULE)常被忽略但功能强大。本教程用规则实施INSERT、UPDATE、DELETE的自动重定向到多个表,实现无需扩展的轻量级数据分发或审计日志。 · 难度:入门 · +10XP
规则系统再造:用重写规则实现轻量级数据分发
PostgreSQL的规则系统(RULE)可以在查询重写阶段拦截DML操作并执行替代逻辑。与触发器不同,规则可以完全重写语句(甚至返回多结果集)。本教程将使用DO INSTEAD规则,将针对主表的INSERT自动复制到历史分区表,或将DELETE转换为软删除标记。同时探讨规则与触发器的关键区别:规则在计划阶段生效,性能更好但无法处理RETURNING在多修改中的歧义。最后演示如何用规则实现简单的一写多读分发系统。
CREATE TABLE sales (id serial, amount numeric, sale_date date);
CREATE TABLE sales_log (LIKE sales);
CREATE RULE sales_insert_log AS ON INSERT TO sales
DO INSTEAD (
INSERT INTO sales VALUES (NEW.*);
INSERT INTO sales_log VALUES (NEW.*);
);
-- 测试插入
INSERT INTO sales (amount, sale_date) VALUES (100, '2026-01-01');
SELECT * FROM sales_log; -- 自动出现一行