Newsgroup: it.comp.software.database
Titolo: [POSTGRESQL] Trigger e Function.

Mi sto' dilettando un po' con PostgreSQL (7.3.2 su SOLinux), ma ho qualche
dubbio nei confronti dei Trigger e delle Function, che la documentazione
ufficiale non è stata in grado di soddisfare.
Nella creazione dei trigger sotto PGSQL non capisco se è obbligatorio avere
una function alle spalle del trigger, o se posso specificare direttamente (e
qui non riesco a trovare nella documentazione come fare) il codice PL/pgSQL
da far eseguire al TRIGGER, anche se ho il sospetto che sia vera solo la
prima ipotesi.
Vi pongo per chiarezza un caso ipotetico:
    -- tabella di prova:
    CREATE TABLE tb_tst (
      tst_id        integer
    , tst_dt_ins    timestamp default current_timestamp
    , tst_dt_upd    timestamp default current_timestamp
    , tst_s_prova   varchar(50)
    );
    -- creo la function da agganciare al trigger:
    CREATE FUNCTION f_upd_tst_dt_upd () RETURNS TRIGGER AS '
      BEGIN
        NEW.tst_dt_upd := current_timestamp;
        RETURN NEW;
      END;
    ' LANGUAGE 'plpgsql';
    -- ora il trigger vero e proprio
    CREATE TRIGGER trg_tb_tst_bu BEFORE UPDATE ON tb_tst FOR EACH ROW
      EXECUTE PROCEDURE f_upd_tst_dt_upd();
Quello che mi piacerebbe fare è avere il seguente codice o qualcosa di
simile:
    CREATE TRIGGER trg_tb_tst_bu BEFORE UPDATE ON tb_tst FOR EACH ROW
    EXECUTE '
      BEGIN
        NEW.tst_dt_upd := current_timestamp;
        RETURN NEW;
      END;
    ' LANGUAGE 'plpgsql';
Grazie in anticipo per le eventuali risposte.
Martino Serri.

 Martino Serri.
 
Mi sto avvicinando anche io a Postgresql e quindi prendi la mia risposta
con le dovute cautele :-) comunque e' valida la prima ipotesi:
cioe' il trigger esegue una funzine gia' esistente, non puoi definirla
direttamente nel suo codice.
ciao.
ps sono daccordo con te: la documentazione sul pl/pgsql e'
veramente _troppo_  scarsa!

 veramente _troppo_  scarsa!
No, scarsa non direi, anzi in alcuni casi è più completa rispetto ad alcuni
prodotti commerciali. Forse alcuni punti sono poco sviluppati o troppo
referenziati.
M.

prima ipotesi.
Infatti. Il trigger punta a una funzione, che quindi deve esistere,
non a un codice compilabile. Penso che sia una scelta di progetto.
Leonardo
-- 
the shadow of the dome of pleasure
floated midway on the waves,
where was heard the mingled measure
from the fountain and the caves.

 Leonardo
Nella Programme's Guide (§19.9) ho poi trovato l'indicazione:
"PL/pgSQL can be used to define trigger procedures. A trigger procedure is
created with the CREATE FUNCTION command as a function with no arguments and
a return type of TRIGGER. Note that the function must be declared with no
arguments even if it expects to receive arguments specified in CREATE
TRIGGER --- trigger arguments are passed via TG_ARGV, as described below."
Ora sto' cercando di capire come devo scrivere la FUNCTION in modo da
accettare i parametri dal trigger.
Ho scritto questa roba:
    CREATE FUNCTION f_upd_dt_upd() RETURNS TRIGGER AS
    '
      DECLARE
        fld_name ALIAS FOR TG_ARGV[0];
      BEGIN
        NEW.fld_name = CURRENT_TIMESTAMP;
        RETURN NEW;
      END;
    '
    LANGUAGE plpgsql;
    CREATE TRIGGER trg_tb_tst_bu BEFORE UPDATE ON tb_tst FOR EACH ROW
      EXECUTE PROCEDURE f_upd_dt_upd('tst_dt_upd');
Solo che quando eseguo un update sulla tabella mi viene generato un errore
di compilazione.
Adesso sto' cercando con google eventuali soluzioni.
M.


:Provate a guardare gli ingredienti del famoso Labello che si usa per
:le labbra screpolate: Butirrospermum Parkii (sperma di maiale).