Ето как вашата тригерна функция ще работи правилно:
CREATE OR REPLACE FUNCTION loca_app.func_historico_mod_usuarios()
RETURNS trigger AS
$func$
BEGIN
EXECUTE format(
'INSERT INTO loca_app.tb_modificacoes
(mod_momento, mod_valor_anterior, mod_valor_atual, mod_usuario, mod_dado)
VALUES (now() , $1.%1$I , $2.%1$I , $3 , $4)
)', TG_ARGV[0])
USING OLD, NEW, TG_RELID
, (SELECT dad_id FROM loca_app.tb_dados
WHERE dad_nome = TG_ARGV[0] -- cast? see blow
LIMIT 1);
RETURN NULL; -- only good for AFTER trigger
END
$func$ LANGUAGE plpgsql;
Основни точки
-
Предайте стойностите на специалния ред
OLDиNEWкакто иTG_RELIDкато стойности заEXECUTEсUSINGклауза. Може да се наложи да изпълнитеTG_RELIDкъм подходящ тип данни. Дефиницията на таблицата наtb_modificacoesе неразкрит. Или наистина искате нещо друго тук. Вижте по-долу.$1,$2и$3в SQL низа, предаден наEXECUTEпрепраща към изразите вUSINGклауза, не към функционални параметри, които могат да бъдат посочени със същия позиционен синтаксис в тялото на функцията външноEXECUTE. -
Свържете вашата динамична SQL команда, като използвате
format(). Много по-чист и безопасен. Цитиране и екраниране на идентификатори , код и стойности правилно!%1$Iи%1$Lса спецификатори на формат заformat(). Прочетете ръководството за подробности. -
Изисква се правилен регистър! Вашата конвенция за изписване на идентификатори с главни букви има смисъл в Oracle, където идентификаторите без кавички се преобразуват в главни букви. Не е полезно в Postgres, където вместо това всичко е сгънато в малки букви:
-
Не използвайте
ILIKEвDAD_NOME ILIKE 'USU_NASCIMENTO'. Идентификаторите на Postgres са чувствителни към главни и малки букви. Вие можете имат множество съответстващи стойности вdad_nome. Използвайте=вместо това и подавайте идентификатори, изписани правилно. И се уверете, чеdad_nomeсе определя уникално. Вижте по-долу. -
Вашият коментар гласи:
MOD_USUARIO , -- Translated to: User (ID). Но това не е това, което преминавате. Ръководството:Може да искате да използвате
current_userилиsession_userвместо това: -
Можете да премахнете
LIMIT 1от подзаявката ifdad_nomeе дефинираноUNIQUE. В противен случай трябва да решите кой ред да изберете в случай на равенство - сORDER BY. -
Функциите за задействане са задължителни за прекратяване с
RETURNизявление. Може също да еRETURN NULLзаAFTERспусък. Ръководството:
Свързани:
- Как да подадете NEW.* към EXECUTE във функция за задействане
- Заменете двойните кавички с единични кавички в Postgres (plpgsql)
Настрани: Докато сте нови в Postgres, може да искате да използвате този вид усъвършенстван динамичен SQL внимателно. Трябва да разбирате какво правите.