[Linuxtrent] Re: Postgres e constraint

  • From: Lele Gaifax <lele@xxxxxxxxxxxxxxxxxxx>
  • To: linuxtrent@xxxxxxxxxxxxx
  • Date: 10 Nov 2003 18:00:11 +0100

>>>>> "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...

ciao, e grazie!!

-- 
nickname: Lele Gaifax   | Quando vivrò di quello che ho pensato ieri
real: Emanuele Gaifas   | comincerò ad aver paura di chi mi copia.
email: lele@xxxxxxxxxx  |               -- Fortunato Depero, 1929.

-- 
Per iscriversi  (o disiscriversi), basta spedire un  messaggio con OGGETTO
"subscribe" (o "unsubscribe") a mailto:linuxtrent-request@xxxxxxxxxxxxx


Other related posts: