postgresql触发可能的infinte循环?

时间:2015-08-03 12:22:07

标签: sql database postgresql

我有一个包含3个字段的表

id, name , value

我想添加第4列calcValuecalcValue的计算基于整个表格中的归档value,将其更改为一行可能会导致所有其他变更。

我想编写一个触发器,每当表中有calcValue时就会更新insert, delete or update

我担心的是触发器本身会有一个Update命令。是否会再次调用此触发器?我会陷入infinte循环吗?

更好地描述它:

CREATE TRIGGER x
  AFTER INSERT OR UPDATE OR DELETE
  ON a
  FOR EACH ROW
  EXECUTE PROCEDURE dosomething();

CREATE OR REPLACE FUNCTION dosomething()
  RETURNS trigger AS
$BODY$

begin 
        code + calculation of result...
                for row in 
                             QUERY
                Loop
             Update a set calValue=result where id=...
                end loop;
end;
$BODY$
  LANGUAGE plpgsql VOLATILE

adosomething()的更新是否会导致另一次触发x?如果它有办法处理它,所以它不会陷入infinte循环?

我的目标是在dosomething()的每次更新/插入/删除操作时执行a次。由于触发器中的更新dosomething(),我不希望再次调用a

编辑:由于我在触发器中更新了一个不同的列,我可以这样做:

CREATE TRIGGER x
    BEFORE UPDATE OF value ON a
    FOR EACH ROW
    EXECUTE PROCEDURE dosomething(); 

这可以解决我的问题,因为触发器更新calcValue并且未在value列上调用tigger。但是我仍然想知道我原来的问题是否有答案...假设触发器会更新同一列。

1 个答案:

答案 0 :(得分:1)

另一种选择是添加when子句,类似于:

CREATE TRIGGER x
AFTER INSERT OR UPDATE OR DELETE
ON a
FOR EACH ROW
WHEN NEW IS NULL OR OLD IS NULL OR NEW.value <> OLD.value
EXECUTE PROCEDURE dosomething();

只有在值字段发生变化时才会执行触发器。因此,当您在触发器内部更新calcValue时,不会再次调用触发器,从而阻止无限“循环”。