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

use*_*442 2 postgresql triggers rule postgresql-9.3

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

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

我也尝试用类似的效果实现一个规则.

我无法想象,当我调用和更新函数时,这是我在应用程序层上必须做的事情.那么如何更新该行的更新列而不会导致无限循环?

Fli*_*mzy 8

使用这样的触发器:

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()
Run Code Online (Sandbox Code Playgroud)

这样你就不会循环 - 你只更新一次值(在执行UPDATE之前),并且你也不会破坏这个值,如果由于某种原因你想updated明确设置(如在导入旧时)例如,来自备份的数据).