thelittlestar  

最近在研究记录字段变更的日志,各种方法都寻遍,偶然看到了用触发器实现数据变更的记录。最开始看的是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;

posted on   上九天捉鳖  阅读(72)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
 
点击右上角即可分享
微信分享提示