2014-03-14 55 views
0

我有应该更新某列,Points触发,更新是同一行中的记录进行了。为此,我创建了一系列功能calc_extrapointcalc_fieldgoalpoint以促进此过程。这两个函数都可以工作,并在手动运行时返回正确的值。触发后更新SQL编译,但似乎并没有火

但是,当我尝试在表更新后触发触发器时,最有可能会发生在列ExtraPointFieldGoal,Points列未如期望的那样更新。

例如iniitally在我的表中的每个记录的所有值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(); 

触发器和函数都可以正确编译,但不会按预期方式触发。有什么我错过了完成行动?

回答

2

修改NEWAFTER触发不会做任何事情。该行已被写入。把RAISE NOTICE 'Trigger fired';放在里面;你会得到通知。只是触发器触发,但什么都不做。

这就是为什么我们有BEFORE触发器。如果要修改要写入表的行,则必须使用BEFORE触发器。

+0

我的担忧是我不知道哪一列将会每次更新。我不能使用before触发器,因为如果我尝试访问未通过'NEW'更新的列,我将不会返回任何值,因为没有新值(如果我错了,请纠正我)。也许我错过了一些东西......你是否认为你可能会发布一个链接到一个例子,就像你用'raise notice'描述的那个例子,在用google搜索一下之后,我没有发现任何似乎导致我失望的事情正确的路径 – ZAX

+2

如果您只想在特定列更改时触发触发器,请使用触发器上的WHEN子句或比较OLD和NEW值。这是所有的文件... –

+0

我现在跟着你。实话虽然被告知,我有12列的统计数据,我正在跟踪。如果我使用if语句来比较旧的和新的值比较以知道计算'points'列需要采用哪些值,那么我会有12条if语句。最重要的是,它的可能的多列可能会一次更新,所以如果需要声明,甚至更多。因此,我倾向于使用“更新后”。是否有一种简单的方法可以访问已更新的行,从每列中获取值,计算点并将其放回'points'列,使用'after'之后? – ZAX