最近在研究记录字段变更的日志,各种方法都寻遍,偶然看到了用触发器实现数据变更的记录。最开始看的是mysql实现的触发器,但是跟我用的postgresql的用法还是存在差异,比如mysql就是直接在创建的触发器后面跟上触发之后的逻辑函数,而postgresql需要先定义触发器函数把触发之后的逻辑写在这个函数里,在创建触发器的时候再执行这个函数(或许postgresql也有在创建的触发器后直接写触发之后操作的方式,只是我没有发现),而且我看到的是对某个表的某个字段执行操作,显然这样一个字段一个字段的写触发器的方式不太适合我的需求,遂放弃,但是也算是多了解了一个知识,为以后可能的情况铺路,实现如下。
1、创建记录数据变更的记录表
CREATE TABLE public.data_change_log ( id int4 NOT NULL DEFAULT nextval('admin_menu_id_seq'::regclass), table_name varchar(100) NOT NULL, column_name varchar(100) NOT NULL, old_value varchar(255) NULL, new_value varchar(255) NULL, change_time timestamp NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT data_change_log_pkey PRIMARY KEY (id) );
2、创建更新时候记录对应表字段customer_tel变更的触发器函数
CREATE or replace FUNCTION log_record() RETURNS trigger as $$ BEGIN IF NEW.customer_tel <> OLD.customer_tel THEN INSERT INTO data_change_log (table_name, column_name, old_value, new_value) VALUES ('clue', 'customer_tel', OLD.customer_tel, NEW.customer_tel); END IF; return new; end; $$ LANGUAGE plpgsql;
3、在需要的表admin_customer_clue上创建触发器并关联上面的触发器函数
CREATE TRIGGER record_data_change AFTER UPDATE ON admin_customer_clue FOR EACH row EXECUTE PROCEDURE log_record();
4、测试更新创建了触发器的表的对应字段会在记录表生成记录
update admin_customer_clue set customer_tel = '15264534248' where customer_clue_id = 15982187057627138;