[Linuxtrent] Postgres e constraint

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

Ciao a tutti,

qualcuno usa Postgres sa darmi un esempio di come si crea un trigger
per il controllo di integrità di una tabella?

Devo portare sotto PG un db Firebird, dove ho una tabella,
AssenzeDipendenti, fatta grosso modo così::

  CREATE TABLE AssenzeDipendenti
  (
    IDDipendente INTEGER PRIMARY KEY,
    DataInizioAssenza Date,
    DataFineAssenza Date
    ...
  )

sulla quale è attivo questo constraint::

  ALTER TABLE AssenzeDipendenti
    ADD CONSTRAINT chk_ad_assenze_sovrapposte
        CHECK (NOT EXISTS (SELECT iddipendente
                           FROM AssenzeDipendenti ad
                           WHERE ad.IDDipendente = NEW.iddipendente
                                 AND ad.DataInizioAssenza <= 
NEW.DataInizioAssenza
                                 AND ad.DataFineAssenza >= 
NEW.DataInizioAssenza));

Ora, scoperto che con PG non posso usare delle subselect nel CHECK, ho
cercato di capire come farlo coi trigger; ho creato questa funzione::

  create function chk_ad_assenze_sovrapposte (integer_t, timestamp_t)
  returns trigger as '
  begin
    if (exists (select iddipendente
                from AssenzeDipendenti ad
                where ad.IDDipendente = $1
                  and ad.DataInizioAssenza <= $2
                  and ad.DataFineAssenza >= $2
      raise exception ''Assenze sovrapposte'';
    end if;
  end;
  ' language plpgsql;

Ma il codice seguente genera un errore per il fatto che "la funzione
xxx non esiste"::

  create trigger trg_ad_assenze_sovrapposte
    before insert or update
    on AssenzeDipendenti
    for each row
      execute procedure chk_ad_assenze_sovrapposte (IDDipendente, 
DataInizioAssenza);

anche se posso vedere la funzione nel database!

Qualche illuminante suggerimento?
ciao, 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: