Как использовать триггер с 3 разными таблицами

#postgresql #database-trigger

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

Вопрос:

Уважаемые коллеги-участники StackOverflow,

У меня есть 3 таблицы. bdc (bdc_id, bdc_name, bdc_gc), stt (stt_id, stt_gc), bts (bts_id, bts_pmv).

Я хочу, чтобы stt_gc = 'Checked' затем установить bdc_gc = 'Sent' и bts_pmv = 'To do'

Я использую Postgresql 11 и, начиная с триггеров / хранимых процедур, я попытался проверить значение if условия stt_gc и соответствие с правильным bdc_gc bts_pmv в соответствии с их первичным ключом.

 create or replace function before_stt_gc() returns trigger
  language plpgsql
as
$$
begin

    if new.stt_gc='Checked' then
      select bdc_gc from bdc
      where new.stt_id = bdc_id;
      doe_gc_bts= 'Sent';
      select bts_pmv from bts
      where new.stt_id = bts_id;
      bts_pmv = 'To do'
    end if;
  end;
$$;

create trigger before_stt_gc_trigger before insert or update on stt
  for each row 
  execute procedure before_stt_gc();
  

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

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

1. Помимо сообщения вам, что вы не можете использовать операторы SELECT в функции plpgsql без назначения результата, мне не совсем ясно, в чем именно заключается ваш вопрос. И ваше соглашение об именовании ужасное.

2. Итак, я не могу получить SELECT без a В, это то, что вы говорите? Мой вопрос написан выше. Я хочу установить значения bdc_gc и bts_pmv при вставке или обновлении, устанавливающих stt_gc = ‘Checked’ . Что вы предлагаете мне сделать с моим соглашением об именовании, чтобы сделать его лучше?

3. Соглашение об именовании: используйте правильные слова вместо сокращений и не добавляйте к столбцам в таблицах имя таблицы. Select: в plpgsql, если вы выполняете SELECT, у вас должно быть назначение. Итак, либо SELECT ... INTO , либо var1 := (SELECT ...) . Чтобы запустить SELECT и полностью отменить вывод, вы должны использовать PERFORM: PERFORM col1 FROM table .

4. @404 Я не использую сокращения. Это проперы, используемые пользователем, который использует эту базу данных. И вы сказали, что не добавляйте префикс к столбцам. Вы имеете в виду, что я должен, например, назвать столбец gc вместо bdc_gc ? Что ж, спасибо за советы. Я не знаю о функции PERFORM.

Ответ №1:

Я полагаю, вы ищете update s в IF инструкции

 if new.stt_gc='Checked' then
  update  bdc  set bdc_gc = 'Sent'
  where new.stt_id = bdc_id;

 UPDATE bts SET bts_pmv = 'To do'
  where new.stt_id = bts_id;

end if;
  

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

1. Это именно то, чего мне не хватало. update Внутри if инструкции. Как я уже сказал, я очень разбираюсь в этом, но я не мог использовать update вот так. Однако вы вставили ; между update таблицами, что приводит к ошибке. В остальном спасибо тебе, чувак!

2. @LyessD : Всегда пожалуйста! Это была ошибка копирования-вставки, сейчас удалена.