On Monday 10 November 2003 18:00, you wrote: > >>>>> "Paolo" == Paolo Armani <armani7@xxxxxxxxxxx> writes: > > Paolo> On Monday 10 November 2003 11:44, you wrote: > >> create function chk_ad_assenze_sovrapposte (integer_t, > >> timestamp_t) > > Paolo> Si dichaira cosi?? Non era create function > Paolo> chk_ad_assenze_sovrapposte (integer, timestamp) > > Sorry, ho omesso la creazione dei domains, ho copiato lo script di > creazione... > > Paolo> Nota che il trigger nel caso in cui vada tutto bene(cioe' > Paolo> quando non viene eseguito un raise exception) deve > Paolo> ritornare sempre il dichiarato trigger: return NEW; > > Uh, aggiunto... (qui il primo hint! :) > > >> Ma il codice seguente genera un errore per il fatto che "la > >> funzione xxx non esiste":: > > Paolo> Spesso succede per problemi di cast, se non funziona con le > Paolo> altre modifiche prova a forzarlo (se non ricordo male cmq > Paolo> dovresti accorgerti perche' nell'errore ti mette anche i > Paolo> tipi che si aspetta) > > Questo è l'errore che ottengo (ma il secondo hint comincia a fare > effetto :): > > error 'ERROR: CreateTrigger: function chk_ad_assenze_sovrapposte() does > not exist ' in ' > create trigger trg_ad_assenze_sovrapposte > before insert or update > on AssenzeDipendenti > for each row > execute procedure chk_ad_assenze_sovrapposte (IDDipendente, > DataInizioAssenza);' > > >> create trigger trg_ad_assenze_sovrapposte before insert or > >> update on AssenzeDipendenti for each row execute procedure > >> chk_ad_assenze_sovrapposte (IDDipendente, DataInizioAssenza); > > Paolo> Se non ricordo male nella funzione creata puoi accedere ai > Paolo> campi della tabella con NEW.nome_colonna e OLD.nome_colonna > Paolo> (quando esistono...) ed eventualmente modificarlo e poi > Paolo> ritornarlo modificato, se il trigger e' stato creato con la > Paolo> clausola before. Quindi o non passi nessun parametro (e > Paolo> quindi anche la funzione quando la crei, non ne dichiara) o > Paolo> li passi cosi' (se sempre ricordo bene...): > > Paolo> execute procedure chk_ad_assenze_sovrapposte > Paolo> (NEW.IDDipendente, NEW.DataInizioAssenza); > > Questo no, mi da questo errore: > > error 'ERROR: parser: parse error at or near "new" at character 158 > ' in ' > create trigger trg_ad_assenze_sovrapposte > before insert or update > on AssenzeDipendenti > for each row > execute procedure chk_ad_assenze_sovrapposte (new.IDDipendente, > new.DataInizioAssenza);' > > Però mi hai dato lo spunto giusto, e ho infine risolto. Il problema > era proprio sul tipo di funzione che si aspetta il trigger. Non l'ho > trovato nella doc, ma in questo caso bisogna fare qc del genere: > > create function chk_ad_assenze_sovrapposte() > returns trigger as ' > begin > if (exists (select iddipendente > from AssenzeDipendenti ad > where ad.IDDipendente = new.IDDipendente > and ad.DataInizioAssenza <= new.DataInizioAssenza > and ad.DataFineAssenza >= new.DataInizioAssenza > raise exception ''Assenze sovrapposte''; > end if; > return new; > end; > ' language plpgsql; > > create trigger trg_ad_assenze_sovrapposte > before insert or update > on AssenzeDipendenti > for each row > execute procedure chk_ad_assenze_sovrapposte(); > > vale a dire, il trigger si aspetta una funzione SENZA parametri, la > quale si trova un NEW (o OLD) che si riferisce al record corrente > della tabella associata... Non proprio, da http://www.postgresql.org/docs/7.3/interactive/sql-createtrigger.html CREATE TRIGGER if_film_exists BEFORE DELETE OR UPDATE ON distributors FOR EACH ROW EXECUTE PROCEDURE check_foreign_key (1, 'CASCADE', 'did', 'films', 'did'); Ripensandoci, passare come parametri new e old si puo' fare nelle rule, non nei trigger ;-) . > > ciao, e grazie!! -- Per iscriversi (o disiscriversi), basta spedire un messaggio con OGGETTO "subscribe" (o "unsubscribe") a mailto:linuxtrent-request@xxxxxxxxxxxxx