如何用触发器实现48张业务表的最后插入时间统一监控?
最优方案:通用触发器函数 + 批量绑定触发器
直接说结论:不要为每张表单独写触发器函数,用一个通用的触发器函数,再为每张业务表绑定对应的触发器即可——这是维护成本最低、代码最简洁的方案。
步骤1:创建汇总表并初始化数据
首先创建存储最后插入时间的汇总表,同时初始化所有48张业务表的记录:
-- 创建汇总表 CREATE TABLE table_last_insert ( table_name TEXT PRIMARY KEY, last_insert_time TIMESTAMPTZ NOT NULL DEFAULT NOW() ); -- 初始化所有业务表的初始记录(替换成你的48张表名) INSERT INTO table_last_insert (table_name) VALUES ('table_1'), ('table_2'), ('table_3'), ..., ('table_48');
步骤2:编写通用触发器函数
利用数据库内置的TG_TABLE_NAME变量(触发器执行时自动获取当前触发的表名),写一个通用函数:
CREATE OR REPLACE FUNCTION update_last_insert_time() RETURNS TRIGGER AS $$ BEGIN -- 根据触发的表名更新汇总表 UPDATE table_last_insert SET last_insert_time = NOW() WHERE table_name = TG_TABLE_NAME; RETURN NEW; -- 对于AFTER触发器,返回值不影响逻辑,仅符合语法要求 END; $$ LANGUAGE plpgsql;
步骤3:批量为业务表创建触发器
不用手动写48个触发器,用SQL生成创建语句,再执行即可:
-- 生成所有业务表的触发器创建语句 SELECT format( 'CREATE TRIGGER trigger_%s_last_insert AFTER INSERT ON %I FOR EACH STATEMENT EXECUTE FUNCTION update_last_insert_time();', table_name, table_name ) FROM table_last_insert;
执行上述语句后,会输出48条CREATE TRIGGER命令,直接复制执行就能完成所有触发器的绑定。
注:这里用
FOR EACH STATEMENT而非FOR EACH ROW,是因为不管一次插入多少行,只需要更新一次最后插入时间即可,性能更优;如果你的业务需要精确到每一行插入的时间(极少场景),再改成FOR EACH ROW。
两种方案对比
- 每张表单独写触发器函数:完全没必要,会产生大量重复代码,后续修改逻辑(比如调整时间格式、增加额外字段)时,需要修改48个函数,维护成本极高。
- 通用函数+批量触发器:代码复用性强,逻辑统一,修改时只需要调整一次通用函数,新增业务表时也只需要往汇总表加一条记录、生成对应触发器即可,扩展性好。
内容的提问来源于stack exchange,提问作者Miko
相关产品推荐
相关产品推荐

