#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 : Всегда пожалуйста! Это была ошибка копирования-вставки, сейчас удалена.