#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 производных значений, и он работает отлично. Спасибо