使用触发器更新行而不会导致无限循环

时间:2015-02-12 18:24:37

标签: postgresql triggers postgresql-9.3 rule

我有一个名为updated的列,用于显示该列的最后一次更改。

我的第一次尝试是创建一个触发器,将updated列更改为now()返回的值。但是因为这个触发器发生在更新事件上,所以它引起了无限循环(更新更新的列导致触发器触发)。

我也试过用类似的效果实现一个规则。

我无法想象当我调用和更新函数时,这是我在应用程序层上必须做的事情。那么如何在不引起无限循环的情况下更新该行的更新列呢?

2 个答案:

答案 0 :(得分:7)

使用这样的触发器:

CREATE OR REPLACE FUNCTION update() RETURNS trigger AS $$
BEGIN
    IF NEW.updated = OLD.updated THEN
        NEW.updated = NOW()
    END IF;
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER table_update
BEFORE UPDATE ON table
FOR EACH ROW EXECUTE PROCEDURE update()

这样你就不会循环 - 你只更新一次值(在执行UPDATE之前),如果由于某种原因你想要设置,你也不会破坏这个值显式updated(例如,从备份导入旧数据时)。

答案 1 :(得分:1)

我已经通过检查我正在更改的字段在其他应用程序中解决了这个问题,如果没有更改,那么我不会进行更新。如果您可以检查更新的列,如果它在最后N秒内,请不要进行更新。这应该停止无限循环。选择N所需的数字,这样您就可以知道更新时间戳总是在N秒内。