1. Qualità dei dati Vincoli di integrità generici
` Predicati che devono essere veri se valutati su istanze
` Qualità dei dati:
corrette (l li) della base di d ti
tt (legali) d ll b dati
` correttezza, completezza, attualità.
` Espressi i d modi:
E i in due di
` In molte applicazioni reali i dati sono di scarsa qualità
` negli schemi delle tabelle
` 5% 40% di dati scorretti
` come asserzioni separate
Basi di Dati ` Per aumentare la qualità dei dati: ` Negli schemi delle tabelle si utilizza la clausola:
CHECK (PREDICATO)
` Regole di integrità
` Manipolazione dei dati tramite p g
p programmi predefiniti
p associata ai vari attributi oppure espressa al termine della
Vincoli, procedure e regole attive in SQL (procedure e trigger) dichiarazione della tabella
SQL: vincoli, procedure e trigger SQL: vincoli, procedure e trigger
3 4
Esempio : gestione magazzino Esempio: definizione di MAGAZZINO Asserzioni
magazzino
`
CREATE TABLE MAGAZZINO AS Predicati espressi separatamente dalla definizione delle
COD-PROD QTA-DISP QTA-RIORD
COD PROD QTA DISP QTA RIORD tabelle, che devono essere veri se valutati su istanze
(COD PROD CHAR(2) PRIMARY KEY
corrette (legali)
1 150 100 QTA DISP INTEGER NOT NULL
CHECK (QTA DISP>10)
3 130 80
CREATE ASSERTION Ordini Limitati AS
4 170 50 QTA RIORD INTEGER NOT NULL
CHECK( 1000 >=
CHECK (QTA RIORD>10)
5 500 150
SELECT COUNT(COD PROD)
( )
CHECK (QTA DISP>QTA RIORD)
FROM RIORDINO )
riordino
)
COD-PROD
COD PROD DATA QTA-ORD
QTA ORD
SQL: vincoli, procedure e trigger SQL: vincoli, procedure e trigger
5 SQL: vincoli, procedure e trigger 6 7
Significato dei vincoli Modifica dinamica del significato dei vincoli Procedure
` ` `
La verifica dei vincoli può essere: Ogni vincolo è definito di un tipo (normalmente Moduli di programma che svolgono una specifica attività
quot;immediate“) di manipolazione dei dati
` Immediate (immediata)
` la loro violazione annulla l'ultima modifica ` `
L'applicazione può modificare il tipo iniziale dei vincoli: Non standard in SQL 2 ma presenti nei principali sistemi
` Deferred (differita) relazionali
` set constraints immediate
` la loro violazione annulla l'intera transazione ` `
set constraints deferred Due momenti:
` Tutti i vincoli vengono comunque verificati, prima o poi. ` dichiarazione (DDL)
` invocazione (DML)
` Con architettura client server sono:
S0 S1 S2 Sf ` invocate dai client
V ` memorizzate e eseguite presso i server
SQL: vincoli, procedure e trigger SQL: vincoli, procedure e trigger SQL: vincoli, procedure e trigger
8 9 10
2. Esempio : prelievo dal magazzino Specifica Procedura
` `
L’utente indica un prelievo dando il codice del prodotto e INTERFACCIA
magazzino
la quantità da prelevare PROCEDURE PRELIEVO (PROD INTEGER, QUANT INTEGER)
COD-PROD QTA-DISP QTA-RIORD
` Se la quantità disponibile in magazzino non è sufficiente ` INVOCAZIONE
1 150 100 la procedura si arresta con una eccezione PRELIEVO(4,150)
3 130 80 ` Viene eseguito il prelievo, modificando la quantità
disponibile in magazzino
4 170 50
` Se la quantità disponibile in magazzino è inferiore alla
5 500 150
Stato iniziale nella base di dati
quantità di riordino si predispone un nuovo ordine
d'acquisto. QTA-DISP
COD-PROD QTA-RIORD
riordino
170
4 50
COD-PROD DATA QTA-ORD
SQL: vincoli, procedure e trigger SQL: vincoli, procedure e trigger
11 SQL: vincoli, procedure e trigger 12 13
Realizzazione della procedura Procedura Esempio di invocazione
PROCEDURE PRELIEVO (PROD INTEGER, QUANT INTEGER) IS PRELIEVO(4,150)
` Dichiarazione variabili
Q1,
Q1 Q2 INTEGER PROD=4, QUANT=150
` Lettura dello stato
X EXCEPTION
` Se la quantità disponibile è insufficiente: eccezione
q p BEGIN SELECT QTA DISP QTA RIORD INTO Q1, Q2
DISP, Q1
` SELECT QTA DISP, QTA RIORD INTO Q1, Q2
Aggiornamento dello stato
FROM MAGAZZINO
FROM MAGAZZINO WHERE COD PROD = PROD;
` Se la nuova quantità disponibile è inferiore alla quantità WHERE COD PROD = PROD
PROD;
IF Q1 < QUANT THEN RAISE(X);
di riordino: emissione di un ordine
UPDATE MAGAZZINO
SET QTA DISP = QTA DISP QUANT QTA-DISP
QTA DISP
COD-PROD
COD PROD QTA-RIORD
QTA RIORD
WHERE COD PROD = PROD; 170
4 50
IF Q1 QUANT < Q2 THEN INSERT INTO RIORDINO
VALUES(PROD, SYSDATE, Q2)
Q1 = 170, Q2 = 50
END
SQL: vincoli, procedure e trigger SQL: vincoli, procedure e trigger SQL: vincoli, procedure e trigger
14 15 16
Invocazione (continua) Regole attive (trigger) Paradigma evento condizione azione (ECA)
` `
IF Q1 < QUANT THEN RAISE(X) non scatta Moduli di programma che svolgono una specifica attività Evento
di manipolazione dei dati ` modifica alla base di dati
UPDATE MAGAZZINO
` Non standard in SQL 2 ma presenti nei principali sistemi ` Condizione
SET QTA DISP = QTA DISP QUANT
relazionali ` predicato
WHERE COD PROD = PROD
` Simili alle procedure, ma l'invocazione è automatica ` Azione
QTA DISP
QTA-DISP
COD PROD
COD-PROD QTA RIORD
QTA-RIORD
` Seguono il paradigma ` modifica alla base di dati, segnalazioni agli utenti
20
4 50
` EVENTO CONDIZIONE AZIONE
Q1 QUANT < Q2 è vero:
` Informalmente
INSERT INTO RIORDINO
` q
quando accade l'evento
VALUES(PROD, S S
S( O SYSDATE, Q2)
` se la condizione è vera
COD-PROD QTA-RIORD
DATA
` allora si esegue l'azione
g
4 2004-10-10 50
SQL: vincoli, procedure e trigger SQL: vincoli, procedure e trigger SQL: vincoli, procedure e trigger
17 18 19
3. Esempio: gestione automatica del riordino Regola attiva (trigger) Esecuzione dell applicazione
dell'applicazione
` EVENTO: CREATE TRIGGER GESTIONE RIORDINO UPDATE MAGAZZINO
` UPDATE(QDISP) IN MAGAZZINO AFTER UPDATE OF QTA DISP ON MAGAZZINO SET QTA DISP = QTA DISP 150
WHEN (NEW.QTA DISP < NEW.QTA RIORD)
( ) WHERE COD PROD = PROD
` CONDIZIONE: FOR EACH ROW
` LA NUOVA QUANTITÀ DISPONIBILE È INFERIORE ALLA (NUOVA) X EXCEPTION QTA-DISP
QTA DISP
COD-PROD
COD PROD QTA-RIORD
QTA RIORD
QUANTITÀ DI RIORDINO: NEW.Q DISP < NEW.Q RIORD
BEGIN 170
4 50
IF NEW QTA DISP < 0 THEN RAISE(X);
NEW.QTA
` AZIONE:
INSERT INTO RIORDINO
` SE LA QUANTITÀ DISPONIBILE E’ INSUFFICIENTE: ECCEZIONE
VALUES(NEW.COD PROD, S S
S( CO O SYSDATE, NEW.QTA RIORD)
Q O)
` EMISSIONE DI UN ORDINE
END
SQL: vincoli, procedure e trigger SQL: vincoli, procedure e trigger SQL: vincoli, procedure e trigger
20 21 22
Esecuzione del trigger Problemi di progetto per procedure e trigger Conseguenze dell’uso di procedure e trigger
dell uso
` ` `
Evento Decomposizione modulare delle applicazioni Aumenta la responsabilità dell'amministratore della base
di dati (rispetto al programmatore applicativo)
` UPDATE(QTA DISP) ON MAGAZZINO
` Condizione ` Paradigma di invocazione:
g
` `
VERA Si sposta quot;conoscenzaquot; dalle applicazioni allo schema
` esplicita (procedure)
della base di dati (indipendenza di conoscenza)
` Azione ` implicita (trigger)
` IF NEW.QTA DISP < 0 THEN RAISE(X) non scatta
` INSERT INTO RIORDINO VALUES (NEW.COD PROD, SYSDATE, ` Aumento di:
NEW.QTA RIORD)
` Efficienza
` Controllo
DATA
COD-PROD QTA
` Riuso
2004-10-10 50
4
SQL: vincoli, procedure e trigger SQL: vincoli, procedure e trigger SQL: vincoli, procedure e trigger
23 24 25
Esercizi
` Riprendere le basi di dati per la gestione degli ordini ed
esprimere:
` Un vincolo di integrità che impedisce la presenza di più di 100
dettagli per ciascun ordine.
d li i di
` Una procedura che elimina tutti gli ordini e i relativi dettagli di
un particolare cliente
` un trigger che scatta quando viene cancellato un cliente ed
elimina tutti gli ordini e i relativi dettagli di quel cliente
g g q
SQL: vincoli, procedure e trigger
26