La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Basi di dati II 1 Basi di dati (modulo 2) Prof. Giovanni Giuffrida Stanza: 362 tel: 095 738 3051

Presentazioni simili


Presentazione sul tema: "Basi di dati II 1 Basi di dati (modulo 2) Prof. Giovanni Giuffrida Stanza: 362 tel: 095 738 3051"— Transcript della presentazione:

1 Basi di dati II 1 Basi di dati (modulo 2) Prof. Giovanni Giuffrida Stanza: 362 tel:

2 Basi di dati II2 Programma Progettazione di basi di dati Il modello entity-relationship (ER) Progettazione Logica, fisica e concettuale Oggetti SQL Vincoli, Viste, Procedure Trigger Esempi su DB commerciali: Oracle e DB2 Esercitazioni

3 Basi di dati II3 Programma, cont. Normalizzazione di schemi relazionali Aspetti sistemistici dei DBMS Cataloghi, schemi Transazioni Piani di esecuzione SQL Avanzato Sequenze Viste materializzate Query multidimensionali (OLAP) Query ricorsive Esercitazioni

4 Basi di dati II4 Programma, cont. Linguaggi procedurali e interfacce PHP, JDBC2, QBE Amministrazione di basi di dati Controllo accessi Monitoring Tuning

5 Basi di dati II5 Vincoli dintegrita Riguardano i valori ammissibili degli attributi di una tupla Vincoli Intrarelazionali: nellambito della stessa relazione Vincoli Referenziali (o Interrelazionali): tra diverse relazioni Vengono controllati durante le tre possibili operazioni di modifica SQL INSERT,DELETE e UPDATE Devono essere sempre soddisfatti altrimenti la transazione fallisce Oppure, lutente puo opzionalmente definire della azioni (correttive) da intraprendere per ripristinare lintegrita

6 Basi di dati II6 A cosa servono i vincoli dintegrita Migliorare la qualita dei dati Arricchire semanticamente la base di dati La loro definizione e parte del processo di progettazione del data base Usati internamente dal sistema per ottimizzare lesecuzione

7 Basi di dati II7 Esempio di DB semanticamente errato StudenteVotoLodeCorso e lode e lode Esami Matricola Cognome Rossi Neri Bianchi Nome Mario Piero Luca Studenti e lode

8 Basi di dati II8 Vincoli sui valori della tupla NOT NULL implicito se lattributo fa parte di una chiave primaria Esempio: campo matricola nella tabella Studente DEFAULT (Costante|NULL) assegna un valore di default per ogni inserimento se non specificato Esempio: DEFAULT CURRENT DATE CHECK Condizione Dove Condizione e unespressione booleana per il controllo di attributi, costanti ed espressioni Devessere valutata True per la corretta esecuzione della transazione Vincoli sul dominio: Esempio: specifica i valori ammissibili nellattributo Voto della tabella Esami: Voto NOT NULL (18 Voto AND Voto 30) Vincoli basati su piu attributi (Lode <> Si) OR (Voto = 30)

9 Basi di dati II9 Definizione vincoli intrarelazionali PRIMARY KEY [Nome Chiave] (Attributo{,Attributo} ) gli attributi devono essere dichiarati tutti NOT NULL Esempio: Attributo Matricola nella relazione Studenti UNIQUE (Attributo{,Attributo} ) definisce una chiave con uno o piu attributi Esempio: (Nome,Cognome,DataDiNascita) Nota: Nome not null unique, Cognome not null unique E diverso da: Nome not null, Cognome not null, UNIQUE (Nome, Cognome)

10 Basi di dati II10 Vincoli dintegrita referenziali (o interrelazionali) Tuple di relazioni diverse sono correlati per mezzo del valore di chiavi (primarie) Servono a garantire che i valori in una certa tabella facciano riferimento a valori reali di unaltra tabella Esempio: Esami(...,Matricola), Studenti( Matricola,...)

11 Basi di dati II11 Matricola Vigili Cognome Rossi Neri Nome Luca Piero Mario MoriGino7543 Infrazioni Codice Data 1/2/95 4/3/95 5/4/96 5/2/98 Vigile ProvNumero MI TO PR 39548K E

12 Basi di dati II12 Auto ProvNumero MI TO PR 39548K E Cognome Rossi Neri Nome Mario Luca Infrazioni Codice Data 1/2/95 4/3/95 5/4/96 5/2/98 Vigile ProvNumero MI TO PR 39548K E MI TO PR 39548K E MI TO PR 39548K E

13 Basi di dati II13 Un vincolo di integrità referenziale (foreign key) fra gli attributi X di una relazione R 1 e unaltra relazione R 2 impone ai valori su X in R 1 di comparire come valori della chiave primaria di R 2 Nellesempio precedente: vincoli di integrità referenziale fra: lattributo Vigile della relazione INFRAZIONI e la relazione VIGILI gli attributi Prov e Numero di INFRAZIONI e la relazione AUTO NULL per evitare il controllo del vincolo Vincolo di integrità referenziale

14 Basi di dati II14 Infrazioni Codice Data 1/2/95 4/3/95 5/4/96 5/2/98 Vigile ProvNumero MI TO PR 39548K E Auto ProvNumero MI TO PR E39548 F Cognome Rossi Neri Nome Mario Luca TOE39548 TO E39548 Violazione di vincolo di integrità referenziale

15 Basi di dati II15 Integrità referenziale e valori nulli Impiegati Matricola Cognome Rossi Neri Verdi Progetto IDEA XYZ NULL Progetti Codice IDEA BOH XYZ Inizio 01/ / /2001 Durata Costo BianchiIDEA

16 Basi di dati II16 Azioni compensative Esempio: Viene eliminata una tupla causando cosi' una violazione Tre possibili azioni Rifiuto dell'operazione ON DELETE NO ACTION (la piu diffusa nei DBMS) Eliminazione in cascata ON DELETE CASCADE: cancella tutte le tuple con valori della chiave esterna corrispondenti alla chiave primaria delle tuple cancellate Introduzione di valori nulli ON DELETE SET NULL assegna il valore NULL agli attributi della chiave esterna

17 Basi di dati II17 Rifiuto della cancellazione Impiegati Matricola Cognome Rossi Neri Verdi Progetto IDEA XYZ NULL 73032BianchiIDEA Progetti Codice IDEA BOH XYZ Inizio 01/ / /2001 Durata Costo XYZ07/ XYZ07/ XYZ07/ NeriXYZ 53524NeriXYZ La transazione fallisce e XYZ non puo essere cancellato dalla relazione Progetti

18 Basi di dati II18 Eliminazione in cascata Impiegati Matricola Cognome Rossi Neri Verdi Progetto IDEA XYZ NULL 73032BianchiIDEA Progetti Codice IDEA BOH XYZ Inizio 01/ / /2001 Durata Costo XYZ07/ XYZ07/ XYZ07/ NeriXYZ La transazione termina e XYZ viene cancellato anche dalla relazione Impiegati

19 Basi di dati II19 Introduzione di valori nulli Impiegati Matricola Cognome Rossi Neri Verdi Progetto IDEA XYZ NULL 73032BianchiIDEA Progetti Codice IDEA BOH XYZ Inizio 01/ / /2001 Durata Costo XYZ07/ XYZ07/ XYZ07/ NULL La transazione termina e allattributo Impiegati.Progetto viene assegnato NULL

20 Basi di dati II20 Auto ProvNumero MI TO PR 39548K E Cognome Rossi Neri Nome Mario Luca Incidenti Codice Data 1/2/95 5/4/96 ProvBNumeroB MI TO 39548K E39548 ProvANumeroA TO PR E Vincoli multipli su più attributi

21 Basi di dati II21 Vincoli Interrelazionali, Sintassi FOREIGN KEY [NomeChiaveEsterna] (Attributo{,Attributo} ) REFERENCES TabellaRef ON DELETE {NO ACTION,CASCADE,SET NULL} dove per la TabellaRef e stata definita una chiave primaria Quindi: impedisce linserimento di tuple con il valore della chiave esterna che non corrisponde ad un valore della chiave primaria della TabellaRef

22 Basi di dati II22 Esempio Riassuntivo CREATE TABLE Clienti ( CodiceCliente CHAR(3) UNIQUE NOT NULL, Nome CHAR(30) NOT NULL, Citta CHAR(30) NOT NULL, Sconto INTEGER NOT NULL CHECK(Sconto>0 AND Sconto<100), PRIMARY KEY pk_Clienti(CodiceCliente)) CREATE TABLE Agenti ( CodiceAgente CHAR(3) UNIQUE NOT NULL, Nome CHAR(30) NOT NULL, Zona CHAR(8) NOT NULL, Supervisore CHAR(3), Commissione INTEGER) PRIMARY KEY pk_Agenti(CodiceAgente), CHECK (Supervisore CodiceAgente OR Supervisore IS NULL)

23 Basi di dati II23 Esempio Riassuntivo CREATE TABLE Ordini( NumOrdine CHAR(3) NOT NULL, CodiceCliente CHAR(3) NOT NULL, CodiceAgente CHAR(3) NOT NULL, Data CHAR(8) NOT NULL, Prodotto CHAR(3) NOT NULL, Ammontare INTEGER NOT NULL CHECK (Ammontare > 100) PRIMARY KEY pk-Ordini (NumOrdine) FOREIGN KEY fk_ClienteOrdine (CodiceCliente) REFERENCES Clienti ON DELETE NO ACTION FOREIGN KEY fk_AgenteOrdine (CodiceAgente) REFERENCES Agenti ON DELETE NO ACTION

24 Basi di dati II24 Viste (View) Oltre alle tabelle di base che fanno parte dello schema si possono creare delle tabelle ausiliarie virtuali Sono virtuali in quanto sembrano tabelle a tutti gli effetti ma sono delle relazioni create al volo Utilizzate per vari scopi: Semplificazione Protezione dati Scomposizione query complesse Riorganizzazione dati secondo nuovi schemi Etc.

25 Basi di dati II25 Definizione VIEW Sintassi creazione VIEW: CREATE VIEW NomeVista [( Attributo {,Attributo} )] AS Query-Select

26 Basi di dati II26 Esempio definizione VIEW CREATE VIEW MediaVoti (Matricola,Media) AS SELECT Matricola, AVG(Voto) FROM Esami GROUP BY Matricola Esecuzione: SELECT * FROM MediaVoti

27 Basi di dati II27 Le VIEW possono essere usate come tabelle SELECT Nome, Media FROM Studenti, MediaVoti WHERE Studenti.Matricola = MediaVoti.Matricola Le VIEW possono essere distrutte alla pari di tabelle DROP (TABLE | VIEW) Nome [RESTRICT|CASCADE] Con RESTRICT non viene cancellata se e utilizzata in altre viste Con CASCADE verranno rimosse tutte le viste che usano la View o la Tabella rimossa Non tutti i sistemi permettono luso di RESTRICT e CASCADE La distruzione di una VIEW non altera le tabelle su cui la VIEW si basa

28 Basi di dati II28 Le VIEW possono essere usate come tabelle Una VIEW puo essere definita sulla base di unaltra VIEW Nelle prime versioni di SQL non era possibile modificare una VIEW tramite Insert, Delete, Update Non piu vero nei nuovi DBMS (Vedremo dopo) Che succede se una tabella usata in una VIEW viene alterata o cancellata (senza specificare RESTRICT o CASCADE)? Dipende dal DBMS: la VIEW viene marcata inoperative, oppure La modifica/cancellazione viene negata Etc.

29 Basi di dati II29 Uso delle VIEW per query complesse Semplificare query complesse Esempio: non possiamo scrivere SELECT AVG(COUNT(*)) FROM AGENTI GROUP BY ZONE AVG deve agire sui valori di un attributo.

30 Basi di dati II30 Uso delle VIEW per query complesse CREATE VIEW AgPerZona (Zona,NumAg) AS SELECT Zona,COUNT(*) FROM AGENTI GROUP BY Zona SELECT AVG(NumAg) FROM AgPerZona DROP AgPerZona

31 Basi di dati II31 Uso delle VIEW per Sicurezza CREATE VIEW EsamiPublici AS SELECT Corso,Voto FROM Esami Data la tabella ClientiBanca(Nome,Indirizzo,Saldo) CREATE VIEW ClientiInd AS SELECT Nome,Indirizzo FROM ClientiBanca

32 Basi di dati II32 Mascherare lorganizzazione logica dei dati tramite VIEW Immaginiamo la seguente tabella: Agenti( CodiceAgente, Nome, Zona, Commissione, Supervisore) Per riorganizzazione aziendale si decide di assegnare un Supervisore ad una zona intera invece del singolo agente 1) CREATE TABLE Zone (Zona CHAR(8), Supervisore CHAR(3)) AS SELECT DISTINCT Zona,Supervisore FROM Agenti 2) CREATE TABLE NuoviAgenti AS SELECT CodiceAgente,Nome,Zona,Commissione FROM Agenti 3) DROP Agenti 4) CREATE VIEW Agenti AS SELECT * FROM NuoviAgenti NATURAL JOIN Zone

33 Basi di dati II33 Aggiornamento delle VIEW Le operazioni INSERT/UPDATE/DELETE sulle VIEW non erano permesse nelle prime edizioni di SQL I nuovi DBMS permettono di farlo con certe limitazioni dovute alla definizione della VIEW stessa Che senso ha aggiornare una VIEW? Dopotutto si potrebbe aggiornare la tabella di base direttamente…

34 Basi di dati II34 Aggiornamento delle VIEW, cont. … utile nel caso di accesso dati controllato Esempio: Impiegato( Nome, Cognome, Dipart, Ufficio, Stipendio) Il personale della segreteria non puo accedere ai dati sullo stipendio ma puo modificare gli altri campi della tabella, aggiungere e/o cancellare tuple Si puo controllare laccesso tramite la definizione della VIEW: CREATE VIEW Impiegato2 AS SELECT Nome, Cognome, Dipart, Ufficio FROM Impiegato INSERT INTO Impiegato2 VALUES (…) Stipendio verra inizializzato a Null Se Null non e permesso per Stipendio loperazione fallisce

35 Basi di dati II35 Aggiornamento VIEW 2 Immaginiamo la seguente VIEW: CREATE VIEW ImpiegatoRossi AS SELECT * FROM Impiegato WHERE Cognome=Rossi La seguente operazione ha senso: INSERT INTO ImpiegatoRossi (…Rossi,…)

36 Basi di dati II36 Aggiornamento VIEW 2, cont. Ma che succede nel caso di: INSERT INTO ImpiegatoRossi (…Bianchi,…) In genere e permesso, finisce nella tabella base ma non e visibile dalla VIEW Si puo controllare tramite lopzione WITH CHECK OPTION: CREATE VIEW ImpiegatoRossi AS SELECT * FROM Impiegato WHERE Cognome=Rossi WITH CHECK OPTION Adesso linsert con Bianchi fallisce, quella con Rossi viene invece eseguita.

37 Basi di dati II37 Aggiornamento VIEW 3 Consideriamo il seguente caso: Impiegato( Nome, Cognome, Dipart, Ufficio, Stipendio) Dipartimenti( Dipart, Indirizzo) CREATE VIEW IMP_IND AS SELECT Nome, Cognome, d.dipart, indirizzo FROM Impiegato i join Dipartimenti d ON i.Dipart=d.Dipart Un INSERT sulla VIEW IMP_IND dovrebbe inserire su entrambe le tabelle base In alcuni casi potrebbe inserire in una ma non nellaltra In genere questoperazione non e consentita Alcuni DBMS consentirebbero lINSERT se Impiegati.Dipart fosse una foreign key su Dipartimenti.Dipart e questultima fosse chiave primaria

38 Basi di dati II38 Aggiornamento VIEW, riepilogo In genere una VIEW definita su una singola tabella e modificabile se gli attributi della VIEW contengono la chiave primaria (e altre chiavi) In genere VIEW definite su piu tabelle non sono aggiornabili Alcuni DBMS, come discusso prima, lo permettono nel caso certe condizioni, molto restrittive, siano rispettate VIEW che usano funzioni di aggregazione non sono aggiornabili PRINCIPIO di base per laggiornamento delle VIEW: Ogni riga ed ogni colonna della VIEW deve corrispondere ad una ed una sola riga ed una ed una sola colonna della tabella base

39 Basi di dati II39 Aspetti procedurali dei DBMS Procedure: Programmi memorizzati nel DBMS che vengono eseguiti su esplicita richiesta degli utenti. Trigger: Programmi memorizzati nel DBMS che vengono attivati automaticamente dopo le operazioni di modifica sulle tabelle

40 Basi di dati II40 Procedure Possono essere costituite da un unico comando SQL parametrizzato I moderni DBMS offrono un linguaggio procedurale piu ricco Oracle: PL/SQL Sybase: Transact/SQL IBM-DB2 MySQL (Ver.5)?? Possono anche essere scritte in linguaggi standard: C/C++, Java Compilate come oggetti esterni integrati dal DBMS In alcuni casi possono eseguire azioni esterne: Cancellare un file Spedire un

41 Basi di dati II41 Linguaggio procedurale Complementano la natura dichiarativa di SQL Costrutti tipo: FOR, WHILE, LOOP, IF, etc. Scansione iterativa di tabelle

42 Basi di dati II42 Esempio linguaggio procedurale DB2 BEGIN ATOMIC DECLARE cur INT; SET cur = MICROSECOND(CURRENT TIMESTAMP); IF cur > THEN UPDATE staff SET name = CHAR(cur) WHERE id = 10; ELSEIF cur > THEN UPDATE staff SET name = CHAR(cur) WHERE id = 20; ELSE UPDATE staff SET name = CHAR(cur) WHERE id = 30; END IF; END Comando IF/THEN

43 Basi di dati II43 Esempio linguaggio procedurale DB2 BEGIN ATOMIC FOR V1 AS SELECT dept AS dname, max(id) AS max_id FROM staff GROUP BY dept HAVING COUNT(*) > 1 ORDER BY dept DO UPDATE staff SET id = id * -1 WHERE id = v1.max_id; UPDATE staff SET dept = dept / 10 WHERE dept = v1.dname AND dept < 30; END FOR; END Comando FOR per scansione tabella

44 Basi di dati II44 Esempio linguaggio procedurale DB2 BEGIN ATOMIC DECLARE c1, C2 INT DEFAULT 1; WHILE c1 < 10 DO WHILE c2 < 20 DO SET c2 = c2 + 1; END WHILE; SET c1 = c1 + 1; END WHILE; UPDATE staff SET salary = c1,comm = c2 WHERE id = 10; END Comando WHILE per scansione tabella

45 Basi di dati II45 Vantaggi delle procedure Consentono di condividere fra gli utenti delle attivita comuni, in modo da centralizzare la manutenzione, la modifica etc.. Unificano la semantica di certe operazioni sul DB per ogni applicazione Possono controllare in modo centralizzato certi vincoli dintegrita non esprimibili nelle tabelle.

46 Basi di dati II46 Riducono il traffico sulla rete dovuto ad applicazioni remote, infatti invece di agire interattivamente con il DBMS lutente spedisce una volta per tutte una chiamata alla procedura ricevendone la risposta. Garantiscono la sicurezza dei dati consentendo a certi utenti di accedere ai dati attraverso certe procedure e non direttamente Vantaggi delle procedure

47 Basi di dati II47 Basi di dati Attive Trigger: Regole basate sul paradigma Event-Condition-Action (ECA) incorporate nella base di dati Struttura tipica di una regola/trigger: when Event if Condition then Action I DBMS attivi hanno un comportamento reattivo in contrasto col passivo della basi di dati tradizionali Eseguono sia transazioni utente che trigger I trigger sono simili alle procedure ma vengono invocati automaticamente in seguito alle operazioni di modifica della base di dati (INSERT/DELETE/UPDATE) Fanno parte della definizione della base di dati Arricchiscono semanticamente lo schema relazionale

48 Basi di dati II48 Basi di dati Attive, cont. La loro sintassi e stata standardizzata in SQL-1999 Sistemi relazionali commerciali (e non) includono i trigger fin dagli anni 80 Cio ha causato difformita di sintassi difficilmente riconciliabile non esiste ancora unimplementazione Standard da un punto di vista sintattico Estensione del CHECK in quanto permettono di operare (modificare) su altre tabelle Possono anche scatenare azioni esterne al DB Spedire , cancellare file, etc.

49 Basi di dati II49 Utilizzo trigger Business rules, parte della procedura di business applicativa (normalmente eseguite in modo asincrono dallapplicazione) Automazione magazzino con riordino automatico Spedizione solleciti Controllo attivita conti bancari/carte di credito Acquisto/Vendita automatica strumenti finanziari Auditing e Logging, memorizzazione eventi per controlli Esempi: Storico delle modifiche effettuate su una tabella per recupero dati Elenco dei login effettuati (da chi e quando) Controllo delle attivita (chi ha fatto cosa e quando) Etc. Version Management Conservare varie versioni dello stato della base di dati nel tempo

50 Basi di dati II50 Utilizzo Trigger Duplicazione database trasparente tramite luso dei trigger Implementazione database distribuiti Vincoli dintegrita complessi non esprimibili con il comando CHECK Workflow management Esempio: Assegnare sostituto per chiamate durgenza

51 Basi di dati II51 Paradigma Event-Condition-Action Semantica operativa: Quando succede levento… … se la condizione e soddisfatta… … esegui lazione specificata Event: Aggiornamento dati tramite INSERT, UPDATE o DELETE Condition: Predicato SQL Opzionale Action: Sequenza di comandi SQL o SQL procedurale, ROLLBACK, etc. Ogni trigger e associato ad una sola tabella e viene attivato dalle operazioni dirette a quella tabella

52 Basi di dati II52 Esempi trigger Espressi in sintassi non-standard: CREATE RULE ControlloStipendio ON Impiegati WHEN Inserted, Deleteted, Updated(Stipendio) IF (select avg(stipendio) from impiegati) > 100 THEN update impiegati set stipendio=stipendio * 0.9 CREATE RULE ControlloRicchi ON Impiegati WHEN Inserted IF EXISTS ( select * from INSERTED where stipendio>100) THEN Insert into ImpiegatiRicchi ( select * from INSERTED where stipendio>100)

53 Basi di dati II53 Esempio esecuzione trigger Aldo90 Maria90 Luca110 Aldo90 Maria90 Luca110 Piero150 Mario120 Inseriamo: (Piero, 150) e (Mario, 120) Il trigger ControlloStipendio parte: Aldo81 Maria81 Luca99 Piero135 Mario108 … La tabella impiegati inizialmente:

54 Basi di dati II54 Esempio esecuzione trigger,cont Aldo73 Maria73 Luca89 Piero121 Mario97 Il trigger ControlloStipendio parte di nuovo: Ricorsione Inoltre, alla fine la tabella ImpiegatiRicchi conterra: Piero121

55 Basi di dati II55 Granularita Due tipi: Row-level Statement-level Row-level Il trigger viene eseguito una volta per ogni tupla coinvolta nelloperazione di modifica Statement-level Il trigger viene eseguito una sola volta per tutte le tuple coinvolte Richiedono una sintassi diversa Row-level: Riferimento ad una riga sola Statement-level: Riferimento ad una tabella

56 Basi di dati II56 Tuple e Tabelle di transizione Tuple e tabelle temporanee visibili allinterno del trigger eseguito che contengono la porzione di dati manipolati dal comando SQL che ha attivato il trigger Servono per accedere ai dati manipolati dal comando che ha scatenato il trigger Vengono usate in modo standard dallSQL del trigger Possono essere usate sia nella condizione che nellazione Nella granularita statement-level il trigger usa delle tabelle di transizione: DELETE: Una tabella di transizione con tutte le tuple cancellate INSERT: Una tabella di transizione con tutte le tuple inserite UPDATE: Una tabella di transizione con tutte le tuple con i vecchi valori ed una con tutte le tuple con i nuovi valori Nella granularita row-level il trigger usa delle tuple di transizione: DELETE: Una per la tupla cancellata INSERT: Una per la tupla inserita UPDATE: Una per la tupla con i vecchi valori ed una con i nuovi valori

57 Basi di dati II57 Modo di esecuzione del trigger Indica se far partire il trigger prima (BEFORE) o dopo (AFTER) lesecuzione fisica del comando impartito BEFORE viene normalmente usato per modificare i dati del comando impartito prima dellesecuzione (fisica) del comando stesso… (vedi esempio) In genere limitato nei comandi che puo eseguire AFTER Molto piu comune Pieno accesso allSQL e SQL procedurale

58 Basi di dati II58 Esempio Trigger BEFORE in DB2 CREATE TRIGGER T1 NO CASCADE BEFORE INSERT ON IMPIEGATO REFERENCING NEW AS N FOR EACH ROW MODE DB2SQL WHEN ( N.STIPENDIO > (SELECT MAX(STIPENDIO) FROM IMPIEGATO)) SET N.STIPENDIO = (SELECT MAX(STIPENDIO) FROM IMPIEGATO)

59 Basi di dati II59 Esempio granularita per AFTER in DB2 create table progetti( codice char(10) not null primary key, Inizio date, Durata int, Costo int ) create table progetti_cancellati( codice char(10) not null, cancellato_il date with default current date ) create trigger storico_prog_canc after delete on progetti referencing old as o for each row mode db2sql begin atomic insert into progetti_cancellati values( o.codice, current date); end create trigger storico_prog_canc2 after delete on progetti referencing old_table as o for each statement mode db2sql begin atomic insert into progetti_cancellati select codice, current date from o; end

60 Basi di dati II60 Esecuzione del trigger Immediata Non appena il comando viene eseguito Nel mezzo della transazione Fa parte della stessa transazione Differita Esecuzione rimandata alla fine della transazione Fa parte della stessa transazione Disaccoppiata Esecuzione del trigger fa parte di una transazione separata, viene quindi eseguito anche se la transazione precedente fallisce Non disponibile in tutti i sistemi Nota che questi modi di esecuzione possono essere in conflitto con la semantica del BEFORE/AFTER Dipende dal DBMS

61 Basi di dati II61 Esempio sintassi trigger Oracle Sintassi Oracle: CREATE TRIGGER NomeTrigger TipoTrigger (TipoOperazione{OR TipoOperazione}) [OF Attributo] ON NomeTabella [FOR EACH ROW] [WHEN (Condizione)] Procedura in PL/SQL TipoTrigger ::= (BEFORE|AFTER) TipoOperazione ::= (DELETE|INSERT|UPDATE) FOR EACH ROW specifica che lazione deve essere ripetuta su ogni n-upla (oppure una volta per tutte)

62 Basi di dati II62 Esempio Oracle PL/SQL Supponiamo che non si accettano ordini con uno scoperto >2.500 CREATE TRIGGER ControlloFido BEFORE INSERT ON Ordini DECLARE DaPagare NUMBER; BEGIN SELECT SUM(Ammontare) INTO DaPagare FROM Ordini WHERE CodiceCliente = :new.CodiceCliente; IF DaPagare > :new.Ammontare THEN RAISE_APPLICATION_ERROR (-2061, fido superato); END IF; END :new valore da inserire o modificato, :old e il valore precedente

63 Basi di dati II63 Creazione ed aggiornamento automatico di una tabella CREATE TABLE Totali(CodiceAgente CHAR(3), TotaleOrdini INTEGER) CREATE TRIGGER aggiornaTotali AFTER INSERT ON Ordini FOR EACH ROW DECLARE esiste NUMBER; BEGIN SELECT COUNT(*) INTO esiste FROM Totali WHERE CodiceAgente = :new.CodiceAgente; IF esiste = 0 $agente non ancora presente$ THEN INSERT INTO Totali VALUES (:new.CodiceAgente, :new.Ammontare); ELSE UPDATE Totali SET TotaleOrdini = TotaleOrdini + :new.Ammontare WHERE CodiceAgente = :new.CodiceAgente; END;

64 Basi di dati II64 Cancellazione automatica Per cancellare la riga dei Totali relativa ad un agente che viene licenziato CREATE TRIGGER cancellaAgente AFTER DELETE ON Agenti FOR EACH ROW BEGIN DELETE FROM Totali WHERE CodiceAgente = :old.CodiceAgente; END; Nota che per il DELETE e stato usato :old

65 Basi di dati II65 Vantaggi sulluso dei Trigger Knowledge Independence, si semplificano le applicazioni che non devono fare i controlli dei trigger Permettono di centralizzare i controlli che quindi non possono essere evitati dagli utenti del DB Arricchimento semantico della base di dati Il controllo diventa parte della transazione stessa, se il controllo fallisce lintera transazione fallisce Puo anche essere eseguito in differita su alcuni DBMS

66 Basi di dati II66 Problemi di Applicabilita dei Trigger Complessita: Bisogna conoscere tutti gli effetti diretti ed indiretti dellazione del trigger (ancora peggio per quelli che attivano altri trigger in cascata) Rigidita: Si potrebbe volere occasionalmente una eccezione al trigger, ma non si puo evitare lattivazione del trigger Debugging: Difficile da eseguire, manca un sistema di controllo e debugging in genere Stessi problemi dei linguaggi dichiarativi (CLIPS, OPS5)

67 Basi di dati II67 Altri problemi semantici Risoluzione di conflitti. Piu trigger sono attivabili allo stesso momento. Varie politiche di gestione Lordine di esecuzione e quello di definizione Lutente specifica un ordine per ogni trigger (e.g., after trig1) Gestito arbitrariamente dal sistema Trigger in Cascata. Trigger si attivano a vicenda, ricorsivamente. Varie politiche di gestione Non permesso Limitazione del numero di attivazioni Dinamico


Scaricare ppt "Basi di dati II 1 Basi di dati (modulo 2) Prof. Giovanni Giuffrida Stanza: 362 tel: 095 738 3051"

Presentazioni simili


Annunci Google