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
OLD
ochNEW
samtTG_RELID
som värden tillEXECUTE
medUSING
klausul. Du kan behöva castaTG_RELID
till en passande datatyp. Tabelldefinitionen förtb_modificacoes
är oupplyst. Eller så vill du verkligen ha något annat här. Se nedan.$1
,$2
och$3
i SQL-strängen som skickades tillEXECUTE
hänvisa till uttryck iUSING
klausul, 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$I
och%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
ILIKE
iDAD_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_nome
definieras 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_user
ellersession_user
istället: -
Du kan ta bort
LIMIT 1
frå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
RETURN
påstående. Kan lika gärna varaRETURN NULL
för enAFTER
utlö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.