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

PostgreSQL中满足条件的After Update触发器未触发问题排查

PostgreSQL触发器未生效问题的修复

问题根源

你的触发器未生效有两个核心原因:

  1. 触发器时机错误:使用after update时,数据库已经完成行的更新操作,此时修改new.remediated不会影响最终存储的数据,必须在更新前(before update)修改行数据才能生效。
  2. WHEN子句限制过窄:原触发器仅在满足new.intended_remediation_date is not null and new.binary_status = 'inactive'时触发,但你的需求是无论条件是否满足都要同步更新remediated字段(符合条件设为true,否则设为false),这导致不符合该条件的更新不会触发函数,即使符合条件,after触发器也无法修改已写入的行。

修正后的代码

保持原函数逻辑(无需修改)

create or replace function set_remediated_status() returns trigger as $$
begin
if new.intended_remediation_date is not null and new.binary_status = 'inactive' then
new.remediated := true;
else
new.remediated := false;
end if;
return new;
end;
$$ language plpgsql;

修改触发器定义

create or replace trigger update_remediated_status
before update of intended_remediation_date,binary_status on evergreen
for each row
execute function set_remediated_status();

修正说明

  • 将after update改为before update:确保函数在数据库写入行之前执行,修改后的new.remediated会被同步存储到数据库。
  • 移除WHEN子句:只要intended_remediation_date或binary_status字段被更新,就会触发函数,覆盖所有场景下的remediated值设置,完全匹配你的需求。

执行你提供的更新语句后,remediated字段会被正确设置为true;后续若修改两个字段中的任意一个导致条件不满足,remediated也会自动设为false。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 14:40:12