[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Postgresql-it] check



Allora, un esempio (anche senza fischio):

Supponiamo di avere: 
- una tabella dei capitoli di un libro, contenente pagina iniziale,
finale e nome del capitolo;
- una tabella dei paragrafi di un libro, contenente pagina del paragrafo
e nome del paragrafo; il check da forzare su questa tabella è che esista
un capitolo che comprenda quella pagina.

Schema:

CREATE TABLE capitoli (
    pag_finale integer NOT NULL,
    pag_iniziale integer NOT NULL,
    nome character varying(30) NOT NULL
) WITHOUT OIDS;

CREATE TABLE paragrafi (
    nome character varying(30) NOT NULL,
    pagina integer NOT NULL
) WITHOUT OIDS;

Trigger/Funzioni:
(devi creare una funzione che contenga il codice da eseguire, e poi un
trigger che lanci la funzione)

CREATE FUNCTION check_paragrafi () RETURNS "trigger"
    AS '
    declare
    rowcount INT4;
    BEGIN
        -- Verifica se esiste una riga di capitoli che comprende la
pagina
        select count(*) into rowcount from capitoli where
pag_iniziale<=new.pagina and pag_finale>=new.pagina;
 
        IF rowcount=0 THEN
            -- se non esiste, lancia l'eccezione e restituisce null per
non bloccare l'insert o l'update
            RAISE EXCEPTION ''check fallito'';
            RETURN NULL;
        END IF;
 
        RETURN NEW;
    END;
'
    LANGUAGE plpgsql;


CREATE TRIGGER check_paragrafi
    BEFORE INSERT OR UPDATE ON paragrafi
    FOR EACH ROW
    EXECUTE PROCEDURE check_paragrafi ();


Qualche dato di prova...

COPY capitoli (pag_finale, pag_iniziale, nome) FROM stdin;
5       1       Primo
9       5       Secondo
19      10      Terzo

Se provi ad inserire un dato tipo
   insert into paragrafi values ('Primo.1',3);
va tutto bene.

Viceversa se tenti
   insert into paragrafi values ('Primo.1',30);
non viene eseguito l'insert.


Spero ti serva.





Il gio, 2004-11-11 alle 17:49, Hypericum ha scritto:
> grazie in anticipo per l'aiuto...
> sto lavorando ad un progetto che stasera si è bloccato alla scoperta
> del fatto che, a differenza di sql, in postgres non posso fare
> controlli su subselect all'interno dei check (in create table per
> intenderci)
> ora: io ho dei dati che devono essere controllati prima
> dell'inserimento e la loro validità o meno dipende dai valori di altre
> tabelle (o anche della stessa, ad esempio controllo che non ci sia già
> un altro valore di quel tipo con select count). come posso fare? i
> trigger se non ho capito male fanno al caso mio ma non riesco a capire
> bene come funzionano.
> grazie ancora
> maria
> 
> 
> ----
> Email.it, the professional e-mail, gratis per te: clicca qui
> 
> Sponsor:
> Qui trovi tutti i manuali che vuoi, clicca e scegli quello più adatto
> a te
> Clicca qui