Почему триггер postgresql не запускается? - PullRequest
0 голосов
/ 16 апреля 2019

Я использую postgresql 11. Я думаю, что моя проблема связана с триггером, который не выполняет обновление, поэтому следующий триггер не запускается.

У меня есть таблица projet со столбцами: projet_temps_doe, projet_temps_etudes, projet_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.

Я хочу извлечь из этого уроки, поэтому, если возможно, объясните мне, что я делаю здесь неправильно,или если моему подходу не хватает понимания.

1 Ответ

1 голос
/ 16 апреля 2019

doc говорит

Триггер сработает только в том случае, если хотя бы один из перечисленных столбцов упоминается как цель команды UPDATE.

Столбец projet_temps_globale_doe не является частью команды обновления, а скорее задается в другом триггере через new.projet_temps_globale_doe = ..., поэтому триггер в этом конкретном столбце не вызывается.

Было бы проще иметь толькоодин триггер на всю таблицу, который устанавливает 3 производных значения.

...