基于触发器的审计回滚与时间旅行查询
讲解如何利用触发器+hstore或JSONB实现行级历史追踪,并支持一键回滚到任意历史版本。 · 难度:入门 · +10XP
基于触发器的审计回滚与时间旅行查询
传统审计只记录谁改了数据,但无法直接回滚。本教程将演示:创建审计表保存每行每次变更的完整快照(使用hstore或JSONB),然后在原表上编写AFTER UPDATE触发器,自动将旧值写入审计表。同时实现一个函数,可根据时间戳和主键将某行恢复到指定历史版本。这种方法不依赖扩展,性能可控,适合合规或误操作恢复场景。
-- 创建审计表
CREATE TABLE employee_audit (
audit_id BIGSERIAL PRIMARY KEY,
table_pk INT,
old_data JSONB,
changed_at TIMESTAMPTZ DEFAULT now()
);
-- 触发器函数
CREATE OR REPLACE FUNCTION audit_employee()
RETURNS TRIGGER AS $$
BEGIN
INSERT INTO employee_audit(table_pk, old_data)
VALUES (OLD.id, to_jsonb(OLD));
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trg_audit
AFTER UPDATE ON employee
FOR EACH ROW EXECUTE FUNCTION audit_employee();