首页 > 解决方案 > 为什么 postgresql 触发器不启动?

问题描述

我使用 postgresql 11。我认为我的问题来自一个不进行更新的触发器,因此下一个触发器不会启动。

我有一个projet带有列的表: projet_temps_doe,,,projet_temps_etudesprojet_temps_globale

目标是根据其他列的值更新每一列。这个想法是:projet_temps_globale= projet_temps_doe+ projet_temps_etudes

我有一个projet_temps_doe完美运行的第一个触发器:

create function temps_globale_doe() returns trigger
    language plpgsql
as
$$
begin
        new.projet_temps_globale_doe :=  new.projet_temps_doe_gc_bts + new.projet_temps_doe_gc_nra;
        return new;
    end;
$$;

CREATE TRIGGER temps_globale_doe
    BEFORE UPDATE OF projet_temps_doe_gc_bts, projet_temps_doe_gc_nra
    ON public.projet
    FOR EACH ROW
    EXECUTE PROCEDURE public.temps_globale_doe();

我有一个类似的触发器,projet_temps_etudes它也可以完美地工作。

然后是我挣扎的触发器projet_temps_globale

create trigger maj_temps_globale_projet
    before update of projet_temps_doe, projet_temps_etudes on projet
    for each row
    execute procedure maj_temps_globale_projet();

create or replace function maj_temps_globale_projet()returns trigger
language plpgsql
as
    $$
    begin
        new.projet_temps_globale := new.projet_temps_doe + new.projet_temps_etudes;
        raise info 'TEST!!';
        return new;
    end;
    $$;

projet_temps_doe和/或projet_temps_etudes通过触发器更新时,我的最后一个触发器没有启动。但是,当我手动更改projet_temps_doe和/或projet_temps_etudes值时,触发器 maj_temps_globale_projet 被触发。

我想从中吸取教训,所以,如果可能的话,向我解释我在这里做错了什么,或者我的方法是否缺乏洞察力。

标签: postgresqlplpgsqldatabase-trigger

解决方案


医生说_

仅当列出的列中的至少一个列被提及为 UPDATE 命令的目标时,触发器才会触发。

该列projet_temps_globale_doe不是更新命令的一部分,而是设置在另一个触发器中,new.projet_temps_globale_doe = ...因此不会调用此特定列上的触发器。

在整个表上只设置一个触发器来设置 3 个派生值会更容易。


推荐阅读