首页 > 解决方案 > postgresSQL 如何仅在更新的行上应用触发器?

问题描述

我正在尝试创建一个函数+触发器,当我的表上有一个名为“nada”的更新或插入时,它会将我的“modif”属性更新为当前日期。

代码运行良好,但所有行都受到影响。我只想要更新行的当前日期。

任何想法 ?

到目前为止,这是我的代码:

CREATE OR REPLACE FUNCTION public.maj_modif()
    RETURNS "trigger" AS
        $BODY$
            BEGIN
                    NEW.modif:= (SELECT current_date);
                RETURN NEW;
            END;
        $BODY$
LANGUAGE plpgsql;

DROP TRIGGER IF EXISTS maj_modif ON public.nada;

CREATE TRIGGER maj_modif BEFORE INSERT OR UPDATE ON public.nada
    FOR EACH ROW
    EXECUTE PROCEDURE public.maj_modif();

如果我在触发器中尝试没有“FOR EACH ROW”的相同代码,我会得到这个错误:«新»尚未受到影响(...)注册行的结构尚未确定。

标签: postgresqlplpgsqldatabase-trigger

解决方案


我假设您只希望在实际更改任何列时触发触发器。

这可以做到

CREATE TRIGGER maj_modif BEFORE UPDATE ON public.nada
   FOR EACH ROW
   WHEN OLD <> NEW
   EXECUTE PROCEDURE public.maj_modif();

这仅适用于UPDATE,因为INSERT OLD未定义 on 。定义不带子句的INSERT触发器。WHEN


推荐阅读