postgresQL 如何仅在更新的行上应用触发器?
postgresSQL How to apply trigger only on updated row?
我正在尝试创建一个函数 + 触发器,当我的 table 上有一个名为 "nada" 的更新或插入时,它将把我的 "modif" 属性更新为当前日期。
代码运行良好,但所有行都是 affected.I 只需要更新行上的当前日期。
有什么想法吗?
到目前为止,这是我的代码:
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" 的相同代码,我会得到这个错误:« new » is not affected yet (...) The structure of the registration line is not yet determined.
我假设您只希望触发器在实际更改任何列时触发。
这可以通过
来完成
CREATE TRIGGER maj_modif BEFORE UPDATE ON public.nada
FOR EACH ROW
WHEN OLD <> NEW
EXECUTE PROCEDURE public.maj_modif();
这仅适用于 UPDATE
,因为 INSERT
OLD
未定义。定义不带 WHEN
子句的 INSERT
触发器。
我正在尝试创建一个函数 + 触发器,当我的 table 上有一个名为 "nada" 的更新或插入时,它将把我的 "modif" 属性更新为当前日期。
代码运行良好,但所有行都是 affected.I 只需要更新行上的当前日期。
有什么想法吗?
到目前为止,这是我的代码:
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" 的相同代码,我会得到这个错误:« new » is not affected yet (...) The structure of the registration line is not yet determined.
我假设您只希望触发器在实际更改任何列时触发。
这可以通过
来完成CREATE TRIGGER maj_modif BEFORE UPDATE ON public.nada
FOR EACH ROW
WHEN OLD <> NEW
EXECUTE PROCEDURE public.maj_modif();
这仅适用于 UPDATE
,因为 INSERT
OLD
未定义。定义不带 WHEN
子句的 INSERT
触发器。