[Linuxtrent] Re: Postgres e constraint

  • From: Paolo Armani <armani7@xxxxxxxxxxx>
  • To: linuxtrent@xxxxxxxxxxxxx
  • Date: Tue, 11 Nov 2003 08:30:36 +0100

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


Other related posts: