我有一个包含3个字段的表
id, name , value
我想添加第4列calcValue
。 calcValue
的计算基于整个表格中的归档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
a
中dosomething()
的更新是否会导致另一次触发x
?如果它有办法处理它,所以它不会陷入infinte循环?
我的目标是在dosomething()
的每次更新/插入/删除操作时执行a
次。由于触发器中的更新dosomething()
,我不希望再次调用a
。
编辑:由于我在触发器中更新了一个不同的列,我可以这样做:
CREATE TRIGGER x
BEFORE UPDATE OF value ON a
FOR EACH ROW
EXECUTE PROCEDURE dosomething();
这可以解决我的问题,因为触发器更新calcValue
并且未在value
列上调用tigger。但是我仍然想知道我原来的问题是否有答案...假设触发器会更新同一列。
答案 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
时,不会再次调用触发器,从而阻止无限“循环”。