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
OLD
ogNEW
samtTG_RELID
som værdier tilEXECUTE
medUSING
klausul. Du skal muligvis casteTG_RELID
til en passende datatype. Tabeldefinitionen af tb_modificacoes
er uoplyst. Eller du vil virkelig have noget andet her. Se nedenfor.$1
,$2
og$3
i SQL-strengen sendt tilEXECUTE
henvise til udtryk iUSING
klausul, 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$I
og%1$L
er 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
ILIKE
iDAD_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_nome
er 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_user
ellersession_user
i stedet: -
Du kan fjerne
LIMIT 1
fra underforespørgslen hvisdad_nome
er 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
RETURN
udmelding. Kan lige så godt væreRETURN NULL
for enAFTER
udlø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.