postgresql 监控表的改动 添加log

需求是这样的, 尝试使用odoo开源系统, 但是需要对接自己的模块.
想偷个懒就直接改odoo的数据库了, 但是虽然能看到调拨记录, 不过却没有刷新记录个数, 导致在自己直接改数据库之后, 在odoo正常操作会导致key_id重复报错
想了两个解决办法, 第一是直接找odoo的源码, 找到插入时检查最新key_id的方法, 直接改了
不过看源码有点头疼
第二个就是希望直接监控数据库的改动, 把所有操作log出来, 然后在直接改数据库的补上漏掉的部分
搜了一下, 可以通过给每个表加触发器的方法实现

CREATE SCHEMA logging;
CREATE TABLE logging.t_history (
        id             serial,
        tstamp         timestamp DEFAULT now(),
        schemaname     text,
        tabname        text,
        operation      text,
        who            text DEFAULT current_user,
        new_val        json,
        old_val        json
);
--------------------------------------------------------
CREATE FUNCTION change_trigger() RETURNS trigger AS $$
       BEGIN
         IF TG_OP = 'INSERT'
         THEN INSERT INTO logging.t_history (
                tabname, schemaname, operation, new_val
              ) VALUES (
                TG_RELNAME, TG_TABLE_SCHEMA, TG_OP, row_to_json(NEW)
              );
           RETURN NEW;
         ELSIF  TG_OP = 'UPDATE'
         THEN
           INSERT INTO logging.t_history (
             tabname, schemaname, operation, new_val, old_val
           )
           VALUES (TG_RELNAME, TG_TABLE_SCHEMA, TG_OP, row_to_json(NEW), row_to_json(OLD));
           RETURN NEW;
         ELSIF TG_OP = 'DELETE'
         THEN
           INSERT INTO logging.t_history
             (tabname, schemaname, operation, old_val)
             VALUES (
               TG_RELNAME, TG_TABLE_SCHEMA, TG_OP, row_to_json(OLD)
             );
             RETURN OLD;
         END IF;
       END;
$$ LANGUAGE 'plpgsql' SECURITY DEFINER;
-----------------------------------------------------
CREATE TRIGGER t BEFORE INSERT OR UPDATE OR DELETE ON 你的表名
        FOR EACH ROW EXECUTE PROCEDURE change_trigger();

要给每个表都添加trigger, 可以先select到所有表名, 然后批量添加trigger

select relname as tabname,cast(obj_description(relfilenode,'pg_class') as varchar) as comment from pg_class c 
where  relkind = 'r' and relname not like 'pg_%' and relname not like 'sql_%' order by relname

最后可以看到效果:
在这里插入图片描述参考链接:https://stackoverflow.com/questions/13785855/how-to-log-data-change-in-postgresql

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值