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
_______________________________________________
Postgresql-it mailing list
Postgresql-it@xxxxxxxxxxxxxxxxx
http://www.linuxtime.it/mailman/listinfo/postgresql-it