Sådan ville din triggerfunktion fungere 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;
Vigtige punkter
-
Send de specielle rækkeværdier
OLDogNEWsamtTG_RELIDsom værdier tilEXECUTEmedUSINGklausul. Du skal muligvis casteTG_RELIDtil en passende datatype. Tabeldefinitionen af tb_modificacoeser uoplyst. Eller du vil virkelig have noget andet her. Se nedenfor.$1,$2og$3i SQL-strengen sendt tilEXECUTEhenvise til udtryk iUSINGklausul, ikke til funktionsparametre, som kan refereres med den samme positionelle syntaks i funktionslegemet udenforEXECUTE. -
Sammensæt din dynamiske SQL-kommando ved hjælp af
format(). Meget renere og sikrere. Citer og escape identifikatorer , kode og værdier ordentligt!%1$Iog%1$Ler formatspecifikationer forformat(). Læs manualen for detaljer. -
Korrekt sag er påkrævet! Din konvention til at stave identifikatorer med store bogstaver giver mening i Oracle, hvor identifikatorer uden anførselstegn konverteres til store bogstaver. Det er ikke nyttigt i Postgres, hvor alt er foldet til små bogstaver i stedet:
-
Brug ikke
ILIKEiDAD_NOME ILIKE 'USU_NASCIMENTO'. Postgres identifikatorer skelner mellem store og små bogstaver. Du kunne har flere matchende værdier idad_nome. Brug=i stedet og videregive identifikatorer stavet korrekt. Og sørg fordad_nomeer defineret unikt. Se nedenfor. -
Din kommentar siger:
MOD_USUARIO , -- Translated to: User (ID). Men det er ikke det, du passerer. Manualen:Du vil måske bruge
current_userellersession_useri stedet: -
Du kan fjerne
LIMIT 1fra underforespørgslen hvisdad_nomeer defineretUNIQUE. Ellers skal du bestemme, hvilken række du vil vælge i tilfælde af uafgjort - medORDER BY. -
Udløserfunktioner er påkrævet for at afslutte med en
RETURNudmelding. Kan lige så godt væreRETURN NULLfor enAFTERudløser. Manualen:
Relateret:
- Sådan sender du NEW.* til EXECUTE i triggerfunktionen
- Erstat dobbelte anførselstegn med enkelte anførselstegn i Postgres (plpgsql)
Bortset: Mens du er ny til Postgres, vil du måske bruge denne form for avanceret dynamisk SQL omhyggeligt. Du skal forstå, hvad du laver.