linux user group brescia

immagine del castello

Archivio della mailing list

Postgres, rules e viwes

Alessandro Fusari alessandro.fusari a siber.it
Ven 2 Nov 2001 10:13:28 UTC
Ciao a tutti,

ho realizzato una tabela di nome log in un db di postgres per tenere
traccia delle attivita di delete, update e insert sulle 3 tabelle
principali. Ogni tabella di cui volgio tenere il log ha un campo id di
tipo serial. Per quanto riguarda il delete e l'update ho fatto una rule
simile a questa ... e funziona perfettamente:

CREATE RULE logupd AS ON UPDATE TO tab001 DO INSERT INTO log (id,
tabella, operazione, utente, data) VALUES (old.id, 'tab001'::text,
'u'::bpchar, text(getpgusername()), "timestamp"('now'::text));

Per l'insert pensavo di fare la stessa cosa ... ma se metto nei values
OLD.id, mi riporta nel log tutti i records della tabella .... se metto
NEW.id invece mi mette nel log l'efettivo nuovo numero del record ...
quello del campo id, ma nella tab001 lo incrementa ancora ... in pratica
se il nuovo id dovrebbe essere 120, 120 viene messo come id nella
tabella di log e in tab001 mi trovo 121 :-(

CREATE RULE logins AS ON INSERT TO tab001 DO INSERT INTO log (id,
tabella, operazione, utente, data) VALUES (NEW.id, 'tab001'::text,
'i'::bpchar, text(getpgusername()), "timestamp"('now'::text));

avete qualche suggerimento ? ... nella documentazione di Postgres non
unsavano mai nelle rules compi serial :-)

Seconda cosa avevo bisogno di avere delle viste con delle INNER JOIN ...
ma visto che non è possible farlo in pg ... così come l'order by nelle
view, mi sono fatto uno script eseguita da crond che mi crea un tabella
ogni notte ... si tratterebbe di un'uso puramente statistico ...  e
pensando alla "complessità" mi chiedevo se rules o triggers potevano
fare la stessa cosa:

drop table tab009;
SELECT tab003.tipologia, tab003.id, tab003.riferimento_id,
tab003.numero_traccia, tab003.titolo_traccia, tab003.durata,
tab003.side, tab002.titolo, tab002.genere, tab002.formato, tab002.suono,
tab002.artista into tab009
FROM tab003 INNER JOIN tab002 ON (tab003.riferimento_id = tab002.id) AND
(tab003.tipologia = tab002.tipologia) order by tab003.tipologia desc,
tab003.riferimento_id, tab003.numero_traccia;
REVOKE ALL on "tab009" from PUBLIC;
GRANT ALL on "tab009" to "postgres";
GRANT SELECT on "tab009" to "user01";

-- 
########Il prezzo dei CD musicali : FURTO LEGALIZZATO !!!############
Non comprate CD a prezzo pieno, solo offerte e usato . In questo modo
mettiamo in ginocchio le multinazionali del disco .
#####################################################################




Maggiori informazioni sulla lista Lug