gpt4 book ai didi

sql - postgresql 触发可能的无限循环?

转载 作者:搜寻专家 更新时间:2023-10-30 23:43:45 26 4
gpt4 key购买 nike

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

id, name , value

我想添加第 4 列 calcValuecalcValue的计算是基于整个表中的字段value,更改一行会导致其他所有更改。

我想编写一个触发器,每当表中有插入、删除或更新时更新calcValue

我担心的是触发器本身将有一个 Update 命令。它会再次调用此触发器吗?我会被无限循环困住吗?

为了更好地描述它:

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

dosomething()a 的更新是否会导致触发器 x 的另一次调用?如果确实如此,是否有办法处理它,使其不会陷入无限循环?

我的目标是对 a 的每个更新/插入/删除操作执行一次 dosomething() 。我不想因为触发器中的更新 a 而再次调用 dosomething()

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

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

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

最佳答案

另一种选择是添加 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 时,不会再次调用触发器,从而防止无限“循环”。

关于sql - postgresql 触发可能的无限循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31787157/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com