You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用触发器实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 15:05:20