Dit is hoe uw triggerfunctie correct zou werken:
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;
Belangrijkste punten
-
Geef de speciale rijwaarden door
OLDenNEWevenalsTG_RELIDals waarden omEXECUTEmet deUSINGclausule. Mogelijk moet jeTG_RELIDcasten naar een passend gegevenstype. De tabeldefinitie vantb_modificacoesis niet bekendgemaakt. Of je wilt hier echt iets anders. Zie hieronder.$1,$2en$3in de SQL-string doorgegeven aanEXECUTEverwijzen naar uitdrukkingen in deUSINGclausule, niet naar functieparameters, waarnaar kan worden verwezen met dezelfde positionele syntaxis in de functietekst buitenEXECUTE. -
Voeg uw dynamische SQL-opdracht samen met
format(). Veel schoner en veiliger. Citeer en ontsnap aan ID's , code en waarden naar behoren!%1$Ien%1$Lzijn formaatspecificaties voorformat(). Lees de handleiding voor details. -
Juiste zaak is vereist! Uw conventie om identifiers met hoofdletters te spellen is logisch in Oracle, waar niet-geciteerde identifiers worden geconverteerd naar hoofdletters. Het is niet handig in Postgres, waar alles in plaats daarvan in kleine letters wordt gevouwen:
-
Gebruik
ILIKEniet inDAD_NOME ILIKE 'USU_NASCIMENTO'. Postgres-ID's zijn hoofdlettergevoelig. Je zou meerdere overeenkomende waarden hebben indad_nome. Gebruik=in plaats daarvan en geef identifiers correct gespeld door. En zorg ervoor datdad_nomeis uniek gedefinieerd. Zie hieronder. -
Uw commentaar zegt:
MOD_USUARIO , -- Translated to: User (ID). Maar dat is niet wat je passeert. De handleiding:Misschien wilt u
current_user. gebruiken ofsession_userin plaats daarvan: -
Je kunt
LIMIT 1verwijderen uit de subquery alsdad_nomeis gedefinieerdUNIQUE. Anders moet je beslissen welke rij je kiest in het geval van een gelijkspel - metORDER BY. -
Triggerfuncties zijn vereist om te beëindigen met een
RETURNuitspraak. Kan net zo goedRETURN NULLzijn voor eenAFTERtrekker. De handleiding:
Gerelateerd:
- Hoe NIEUW.* door te geven aan UITVOEREN in de triggerfunctie
- Vervang dubbele aanhalingstekens door enkele aanhalingstekens in Postgres (plpgsql)
Terzijde: Hoewel Postgres nieuw voor u is, wilt u dit soort geavanceerde dynamische SQL misschien zorgvuldig gebruiken. Je moet begrijpen wat je doet.