Så här skulle din triggerfunktion fungera korrekt:
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;
Huvudpunkter
-
Skicka de speciella radvärdena
OLDochNEWsamtTG_RELIDsom värden tillEXECUTEmedUSINGklausul. Du kan behöva castaTG_RELIDtill en passande datatyp. Tabelldefinitionen förtb_modificacoesär oupplyst. Eller så vill du verkligen ha något annat här. Se nedan.$1,$2och$3i SQL-strängen som skickades tillEXECUTEhänvisa till uttryck iUSINGklausul, inte till funktionsparametrar, som kan refereras med samma positionella syntax i funktionskroppen utanförEXECUTE. -
Sammanfoga ditt dynamiska SQL-kommando med
format(). Mycket renare och säkrare. Citera och undvik identifierare , kod och värden ordentligt!%1$Ioch%1$Lär formatspecifikationer förformat(). Läs manualen för detaljer. -
Rätt fall krävs! Din konvention att stava identifierare med stora bokstäver är meningsfull i Oracle, där identifierare utan citattecken konverteras till versaler. Det är inte användbart i Postgres, där allt viks till gemener istället:
-
Använd inte
ILIKEiDAD_NOME ILIKE 'USU_NASCIMENTO'. Postgres-identifierare är skiftlägeskänsliga. Du kunde har flera matchande värden idad_nome. Använd=istället och skicka identifierare stavade korrekt. Och se till attdad_nomedefinieras unikt. Se nedan. -
Din kommentar säger:
MOD_USUARIO , -- Translated to: User (ID). Men det är inte det man klarar av. Manualen:Du kanske vill använda
current_userellersession_useristället: -
Du kan ta bort
LIMIT 1från underfrågan omdad_nomeär definierad somUNIQUE. Annars måste du bestämma vilken rad du ska välja vid oavgjort - medORDER BY. -
Triggerfunktioner krävs för att avsluta med en
RETURNpåstående. Kan lika gärna varaRETURN NULLför enAFTERutlösare. Handboken:
Relaterat:
- Hur man skickar NEW.* till EXECUTE i triggerfunktionen
- Ersätt dubbla citattecken med enkla citattecken i Postgres (plpgsql)
Åsido: Medan du är ny på Postgres kanske du vill använda den här typen av avancerad dynamisk SQL noggrant. Du måste förstå vad du gör.