PostgreSQL同事件多行行级触发器的触发顺序咨询
多行插入时AFTER INSERT触发器的执行顺序解析
首先明确PostgreSQL中触发器的两种触发粒度,这直接决定执行逻辑:
1. 行级触发器(FOR EACH ROW)
如果trigA和trigB是行级触发器(需明确指定FOR EACH ROW),执行流程为:
- 对插入的每一行,按触发器创建的先后顺序依次执行所有触发器
- 具体逻辑:行1执行
funcA→ 行1执行funcB→ 行2执行funcA→ 行2执行funcB……以此类推 - 这种模式下,
funcA无法先完成所有行的操作再触发funcB,不符合你的需求
2. 语句级触发器(FOR EACH STATEMENT)
如果定义为语句级触发器(指定FOR EACH STATEMENT),执行流程为:
- 整个插入语句执行完成后,所有插入的行都已写入表并可见,再按触发器创建顺序依次执行
- 具体逻辑:插入所有行完成 → 执行一次
funcA(可访问所有新插入行) → 执行一次funcB - 这完全满足你“
funcA完成所有行操作并可见后再触发funcB”的要求
实现示例
创建符合需求的语句级触发器:
-- 创建funcA函数(示例) CREATE OR REPLACE FUNCTION funcA() RETURNS TRIGGER AS $$ BEGIN -- 编写针对所有新插入行的操作逻辑 RETURN NULL; -- 语句级触发器无需返回行 END; $$ LANGUAGE plpgsql; -- 创建funcB函数(示例) CREATE OR REPLACE FUNCTION funcB() RETURNS TRIGGER AS $$ BEGIN -- 编写需要在funcA完成后执行的逻辑 RETURN NULL; END; $$ LANGUAGE plpgsql; -- 创建先执行的语句级触发器trigA CREATE TRIGGER trigA AFTER INSERT ON your_table_name FOR EACH STATEMENT EXECUTE FUNCTION funcA(); -- 创建后执行的语句级触发器trigB CREATE TRIGGER trigB AFTER INSERT ON your_table_name FOR EACH STATEMENT EXECUTE FUNCTION funcB();
额外说明
- 触发器的执行顺序由创建顺序决定,先创建的触发器先执行
- 若需调整已存在触发器的顺序,可先禁用旧触发器,再按目标顺序重新创建;不推荐直接修改系统表
pg_trigger的tgorder字段
内容的提问来源于stack exchange,提问作者James M
相关产品推荐
相关产品推荐

