Vaše spouštěcí funkce by správně fungovala takto:
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;
Hlavní body
-
Předejte speciální hodnoty řádku
OLDaNEWstejně jakoTG_RELIDjako hodnoty naEXECUTEpomocíUSINGdoložka. Možná budete muset odeslatTG_RELIDna vhodný datový typ. Definice tabulkytb_modificacoesje nezveřejněno. Nebo tu opravdu chcete něco jiného. Viz níže.$1,$2a$3v řetězci SQL předanémEXECUTEodkazujte na výrazy vUSINGklauzule, ne na parametry funkce, na které lze odkazovat se stejnou polohovou syntaxí v těle funkce mimoEXECUTE. -
Spojte svůj dynamický příkaz SQL pomocí
format(). Mnohem čistší a bezpečnější. identifikátory citujte a escapujte , kód a hodnoty správně!%1$Ia%1$Ljsou specifikátory formátu proformat(). Podrobnosti naleznete v příručce. -
Je vyžadována správná velikost písmen! Vaše konvence používat identifikátory pravopisu s velkými písmeny má smysl v Oracle, kde jsou identifikátory bez uvozovek převedeny na velká písmena. Není to užitečné v Postgresu, kde je místo toho vše složeno na malá písmena:
-
Nepoužívejte
ILIKEvDAD_NOME ILIKE 'USU_NASCIMENTO'. Identifikátory Postgres rozlišují velká a malá písmena. Mohli byste mít více odpovídajících hodnot vdad_nome. Použijte=místo toho a předejte správně napsané identifikátory. A ujistěte se, žedad_nomeje definována jedinečná. Viz níže. -
Váš komentář říká:
MOD_USUARIO , -- Translated to: User (ID). Ale to není to, co předáte. Manuál:Možná budete chtít použít
current_usernebosession_usermísto toho: -
Můžete odstranit
LIMIT 1z poddotazu ifdad_nomeje definováno jakoUNIQUE. Jinak se musíte rozhodnout, kterou řadu vybrat v případě nerozhodného výsledku – pomocíORDER BY. -
Spouštěcí funkce jsou vyžadovány ukončíte znakem
RETURNtvrzení. Může být takéRETURN NULLproAFTERspoušť. Příručka:
Související:
- Jak předat NEW.* do EXECUTE ve funkci spouštění
- Nahraďte dvojité uvozovky jednoduchými uvozovkami v Postgres (plpgsql)
Strana: Zatímco jste v Postgresu nováčkem, možná budete chtít tento druh pokročilého dynamického SQL používat opatrně. Musíte rozumět tomu, co děláte.