[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Postgresql-it] check
- From: Nicola Alessi <mailinglists@xxxxxxxxxx>
- Subject: Re: [Postgresql-it] check
- Date: Thu, 11 Nov 2004 20:37:07 +0100
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