PostgreSQL更新后触发器设置的列值未持久化问题
问题原因及解决方案
问题根源
你创建的是AFTER UPDATE触发器,这类触发器的执行时机是数据库已经完成数据更新并写入表之后。此时在触发器函数中修改NEW对象的number值,只是修改了内存中的临时对象,并不会对已经存储到表中的记录产生影响,所以新值无法持久化。
解决方案
将触发器类型改为BEFORE UPDATE,这样触发器会在数据库执行更新操作、数据写入表之前触发。此时修改NEW对象的属性,数据库会使用修改后的NEW来完成最终的写入操作,新的number值就能正常持久化到表中。
修改后的触发器代码:
CREATE TRIGGER update_number_trig BEFORE UPDATE ON projects FOR EACH ROW WHEN (NEW.status = 'CAPITAL') EXECUTE PROCEDURE update_number();
补充说明
BEFORE触发器的核心场景就是在数据落地前修改即将写入的记录;AFTER触发器更适合用于记录操作日志、触发异步任务等不需要修改原记录的场景。
内容的提问来源于stack exchange,提问作者Samuel Alito
相关产品推荐
相关产品推荐

