PosgtreSQL触发器监控表的数据操作记录(json格式)

发布于:2023-10-25 ⋅ 阅读:(117) ⋅ 点赞:(0)


一、创建测试表

创建测试表users、users_t、user_history(监控表数据变动的日志表)

CREATE TABLE users
(
  id serial NOT NULL,
  username character varying(40),
  email character varying(100)
);

CREATE TABLE users_t
(
  id serial NOT NULL,
  username character varying(40),
  email character varying(100),
  age int8
);

CREATE TABLE user_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 or replace FUNCTION change_user_trigger()
    RETURNS trigger AS $$
    BEGIN
        IF TG_OP = 'INSERT' THEN
            INSERT  INTO user_history(tabname,schemaname,operation,new_val,operation_ip)  values(TG_RELNAME,TG_TABLE_SCHEMA,TG_OP,row_to_json(NEW)
            ,(select client_addr from pg_stat_activity where pid = pg_backend_pid()));
        RETURN NEW;
        ELSIF TG_OP = 'UPDATE'  THEN
                INSERT INTO user_history(tabname,schemaname,operation,new_val,old_val,operation_ip) values(TG_RELNAME,TG_TABLE_SCHEMA,TG_OP,row_to_json(NEW),row_to_json(OLD)
                ,(select client_addr from pg_stat_activity where pid = pg_backend_pid()));
        RETURN NEW;
        ELSIF TG_OP = 'DELETE'  THEN
              INSERT INTO user_history(tabname,schemaname,operation, old_val,operation_ip) values(TG_RELNAME,TG_TABLE_SCHEMA,TG_OP,row_to_json(OLD)
              ,(select client_addr from pg_stat_activity where pid = pg_backend_pid()));
    RETURN OLD; --返回值要与ELSIF平齐,因为先插入后最好才执行返回
    END IF;
END;
$$ LANGUAGE 'plpgsql' SECURITY DEFINER;

三、创建触发器

在users、users_t上创建触发器,监控INSERT 、 UPDATE 、 DELETE操作

CREATE TRIGGER "logging_user_change"
  BEFORE INSERT OR UPDATE OR DELETE
  ON users
  FOR EACH ROW
  EXECUTE PROCEDURE change_user_trigger();
CREATE TRIGGER "logging_users_t_change"
  BEFORE INSERT OR UPDATE OR DELETE
  ON users_t
  FOR EACH ROW
  EXECUTE PROCEDURE change_user_trigger();

四、插入、删除测试数据测试功能

插入、删除测试数据测试功能

INSERT INTO users(username,email) VALUES ( 'hans','hans@qq.com');
UPDATE users SET id = 1, username ='paul';

INSERT INTO users(username,email) VALUES ( 'tzq','tzq@qq.com');
INSERT INTO users(username,email) VALUES ( 'tzq2','tzq2@qq.com');

INSERT INTO users_t(username,email,age) VALUES ( 'tzq2','tzq2@qq.com',18);
INSERT INTO users_t(username,email,age) VALUES ( 'tzq3','tzq3@qq.com',19);
INSERT INTO users_t(username,email,age) VALUES ( 'tzq4','tzq4@qq.com',20);
delete from users where id = 3;
select * from users;

五、插入监控日志表数据,查看结果

插入监控日志表数据,查看结果

select * from user_history;

网站公告

今日签到

点亮在社区的每一天
去签到