Почему не запускается триггер postgresql?

#postgresql #plpgsql #database-trigger

#postgresql #plpgsql #база данных-триггер

Вопрос:

Я использую 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:

В документе говорится

Триггер сработает только в том случае, если хотя бы один из перечисленных столбцов указан в качестве цели команды ОБНОВЛЕНИЯ.

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

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

Комментарии:

1. Правильно, я использую только один триггер для 3 производных значений, и он работает отлично. Спасибо