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

PostgreSQL 16更新employees表触发规则无限递归错误求助

解决PostgreSQL UPDATE规则导致的无限递归错误

错误原因

你遇到的infinite recursion detected错误,核心原因是PostgreSQL的规则(Rule)是查询重写机制,而非行级触发逻辑:

  • 当执行UPDATE set salary=80000时,规则update_salary会将原查询重写为UPDATE set salary=70000的语句;
  • 这个重写后的UPDATE语句会再次进入规则校验流程;
  • 你使用的pg_trigger_depth() = 0仅对**触发器(Trigger)**生效,规则执行不会改变触发深度值,导致每次重写后的语句都会再次触发规则,最终陷入无限递归。

解决方案:替换规则为BEFORE UPDATE触发器

触发器是行级触发机制,能直接在更新前修改行数据,无需额外执行UPDATE语句,从根源避免递归。

步骤1:删除原有规则

drop rule if exists update_salary on rowan.employees;

步骤2:创建触发器函数

这个函数会在更新前检查薪资,超过70000则自动修正为70000:

create or replace function rowan.cap_salary()
returns trigger as $$
begin
  if new.salary > 70000 then
    new.salary := 70000;
  end if;
  return new;
end;
$$ language plpgsql;

步骤3:绑定触发器到表

create trigger cap_salary_trigger
before update on rowan.employees
for each row
execute function rowan.cap_salary();

测试验证

执行你原来的更新语句:

update rowan.employees set salary = 80000 where emp_id = 3;

查询数据:

select * from rowan.employees;

此时emp_id=3的薪资会被正确设置为70000,且无递归错误。


内容的提问来源于stack exchange,提问作者Rafael Orta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 22:07:38