我有一个触发器,在对同一行中的记录进行更新后,应该更新某个列Points
。为此,我创建了一系列函数calc_extrapoint
和calc_fieldgoalpoint
来促进这一过程。当手动运行时,这两个函数都可以工作并返回正确的值。
但是,当我尝试在更新表格后触发触发器时,ExtraPoint
或FieldGoal
列很可能会发生Points
列未更新为我期待。
例如,在我的表中,每个记录的所有值分别对于点,额外点和字段目标列的0,0,0开始。当我更新额外的点列虽然说2,我希望点列为2.如果我这次再次更新,字段目标点为2,我希望我的点列设置为8.
create or replace function calc_points() returns trigger as $$
begin
NEW."Points" := calc_extrapoint(NEW."ExtraPoint") + calc_fieldgoalpoint(NEW."FieldGoal");
return NEW;
end
$$ LANGUAGE plpgsql;
DROP TRIGGER calc_points on playerdata;
CREATE TRIGGER calc_points AFTER UPDATE ON playerdata
FOR EACH ROW EXECUTE PROCEDURE calc_points();
触发器和函数都进行了适当的编译,但没有按预期触发。是否有一些我缺少的东西来完成这个动作?
答案 0 :(得分:2)
修改NEW
触发器中的AFTER
无法执行任何操作。该行已经写好了。在那里放一个RAISE NOTICE 'Trigger fired';
;你会收到通知。只是触发器触发,但什么都不做。
这就是为什么我们有BEFORE
个触发器。如果要修改要写入表的行,则必须使用BEFORE
触发器。