07 Basi Di Dati Attive

38
Basi di dati attive 1 Sommario Approcci architetturali Linguaggi per la specifica di trigger: Eventi Condizioni Azioni Ulteriori caratteristiche Modello di esecuzione: Esecuzione delle regole Soluzione dei conflitti Terminazione

Transcript of 07 Basi Di Dati Attive

Page 1: 07  Basi Di Dati Attive

Basi di dati attive

1

SommarioApprocci architetturaliLinguaggi per la specifica di trigger:

EventiCondizioniAzioniUlteriori caratteristiche

Modello di esecuzione:Esecuzione delle regoleSoluzione dei conflittiTerminazione

Page 2: 07  Basi Di Dati Attive

2

Sommario

Trigger in SQL:SintassiModello di esecuzione

Applicazione dei trigger:Vincoli d’integritàCalcolo di dati derivatiRegole operative

3

DBMS passivi vs. attiviI DBMS tradizionali sono passivi: eseguono delle operazioni solo su richiesta

Spesso si ha la necessità di avere capacità reattive: il DBMS reagisce autonomamente ad alcuni eventi ed esegue determinate operazioni

DBMS con queste funzionalità sono conosciuti come DBMS attivi (ADBMS), tramite cui è possibile definire regole attive o trigger

Page 3: 07  Basi Di Dati Attive

4

DBMS attivi: applicazioni

Esempi di applicazioni dei DBMS attivi:Controllo di processiGestione automatizzata del lavoro di ufficioSistemi di controllo in ambito medicoReti di sensori

5

DBMS attivi

La conoscenza di tipo reattivo viene sottratta ai programmi applicativi e codificata (tramite comandi del DDL) in regole attiveQuesto consente di definire il comportamento reattivo una sola volta e di farlo condividere da più applicazioniBenefici in termini di efficienza e costi di manutenzione

Page 4: 07  Basi Di Dati Attive

6

DBMS attivi

Iniziano ad affermarsi a partire dagli anni 90I maggiori DBMS commerciali (Oracle, IBM DB2, Microsoft SQL Server) sono stati estesi con la possibilità di specificare triggerA partire da SQL:1999 anche lo standard recepisce tali estensioniAttualmente i DBMS non sono completamente allineati a SQL:2003

7

Esempio

Gestione automatizzata di un magazzino in cui se la quantità di un prodotto scende sotto le 4 unità devo ordinare 100 item di tale prodottoDBMS tradizionale: Magazzino

Prodotto Quantità

x 5DBMS

Vendita di 2 item del prodotto x

Quantità di prodotto disponibile?

Ordine di 100 itemdi prodotto x 3

12

<= 3

Page 5: 07  Basi Di Dati Attive

8

Esempio

DBMS attivo:Trigger T: se la quantità diventa <4 allora ordina 100 item

Magazzino

Trigger T

Prodotto Quantità

x 5ADBMS

Vendita di 2 item del prodotto x

Ordine di 100 itemdi prodotto x 3

9

DBMS attiviIl lucido precedente mostra un esempio di uso dei trigger per il monitoraggioAltri esempi:

Vincoli di integritàAlertingAuditingSicurezzaStatisticheEccezioni

Page 6: 07  Basi Di Dati Attive

10

Approcci architetturali

DBMS passivi: approccio 1

Applicazioni(modifiche)

Polling periodicoDBMS passivo

controllo

risposta

Problema: determinare la frequenza ottima di polling

11

Approcci architetturali

DBMS passivi: approccio 2

DBMS passivoApplicazioni estese con codice per il monitoraggio di situazioni

Problema: • Compromette la modularità e la riusabilità del codice

• quando cambia la condizione monitorata, cambia l’applicazione• La correttezza del comportamento del sistema dipende dalla

corretta implementazione dei programmi applicativi

Page 7: 07  Basi Di Dati Attive

12

Approcci architetturali

DBMS attivi

Interrogazioni e modifiche

DBMS attivoEventi esterni

Specifica delle situazionida monitorare

(re-) azioni

13

DBMS attivi

DBMS attivi:Supportano il monitoraggio di situazioniIntegrazione della componente reattiva con le altre componenti del DBMSSemantica ben definitaEfficienza Condivisione

Page 8: 07  Basi Di Dati Attive

14

Specifica di triggerUna base di dati attiva è una base di dati nella quale alcune operazioni sono automaticamente eseguite quando si verifica una determinata situazione interna o esterna alla base di datiLa situazione può corrispondere al fatto che:

Si verifichino eventi specifici (insert, update, ecc.)Siano state riscontrate particolari condizioni o particolari stati o transizioni di stato

Un trigger (o regola attiva) è il costrutto sintattico per definire la reazione del sistemaI trigger sono specificati nel DDL del DBMS

15

Paradigma ECAIl paradigma più noto per la definizione dei trigger è quello Evento-Condizione-Azione (ECA)La forma più comune di trigger è quindi:

ON evento IF condizione THEN azione1. Se si verifica l’evento, la condizione è

valutata2. Se la condizione è soddisfatta l’azione

viene eseguita

Page 9: 07  Basi Di Dati Attive

16

Eventi“Un evento è qualcosa che accade, che è di

interesse (per la definizione delle regole) e che può essere mappato, dal punto di vista del

sistena, in un istante di tempo”

Aggiornamento dati: inserimento, cancellazione, modificaAccesso ai dati: interrogazione su una tabellaOperazioni di sistema: login utenti, operazioni connesse alla gestione di transazioni e/o delle autorizzazioniEventi temporali: ogni giorno alle 12Eventi esterni: ad esempio, definiti da una applicazione

17

EventiPossibilità di definire trigger che possono essere attivati before o after un eventoPossibilità di combinare gli eventi (eventi composti) tramite:

Operatori logici: and, or, ecc.Sequenza: seleziono un trigger se due o più eventi accadono in un certo ordineComposizione temporale: seleziono un trigger quando l’evento E2 avviene 5 sec. dopo l’evento E1

Page 10: 07  Basi Di Dati Attive

18

Eventi

Tutti i i DBMS commerciali che forniscono i trigger permettono di specificare come eventi operazioni di aggiornamento datiAlcuni (es. Oracle) ammettono come eventi anche determinate operazioni di sistema e/o supportano eventi composti (es. PostgreSQL)

19

Condizioni“Una condizione è un ulteriore controllo che viene eseguito quando il trigger è considerato e prima che

l’azione sia eseguita”

Predicati: clausola WHERE di SQLInterrogazioni: condizione vera se e solo se l’interrogazione non restituisce l’insieme vuotoIn entrambi i casi precedenti, per ragioni di efficienza, è di solito possibile utilizzare solo un sottoinsieme di quanto offerto da SQLFunzioni applicative: chiamata ad una funzione

Page 11: 07  Basi Di Dati Attive

20

Condizioni

La condizione può far riferimento a stati passati o a variabili di sistema (es. id utente)Se la condizione non c’è si assume veraNon tutti i DBMS commerciali permettono la definizione della condizione (vedi SQL Server e PostgreSQL)

21

Condizioni vs. eventi

Perché è vantaggioso avere l’evento?La condizione è costosa (in termini di efficienza) da valutare, mentre rilevare l’accadere di un evento è molto meno complesso

Questo problema è ancora più sentito per basi di dati di grosse dimensioniInoltre, posso specificare azioni diverse per eventi diversi e stessa condizione

Page 12: 07  Basi Di Dati Attive

22

Azioni“Un’azione è una sequenza di operazioni che viene

eseguita quando il trigger è considerato e la sua condizione è vera”

Aggiornamento dati: inserimento, cancellazione, modificaAccesso ai dati: interrogazione su una tabellaAltri comandi: definizione dati, controllo delle transazioni (commit, rollback), specifica/revoca autorizzazioniProcedure applicative: chiamata ad una procedura

23

Tabelle di transizione

L’insieme delle tuple inserite, cancellate o modificate da un evento viene chiamato tabella di transizioneNel caso di “tuple modificate” le tabelle sono due: una contiene i valori prima della modifica, mentre l’altra contiene i valori successivi alla modifica Possono essere usate nella valutazione della condizione e/o dell’azione di un trigger

Page 13: 07  Basi Di Dati Attive

24

Comandi per la gestione di trigger

I DBMS che forniscono funzionalità attive prevedono comandi per la:

Creazione/cancellazione e modifica di triggerTemporanea abilitazione/disabilitazione di trigger

25

EsempioRelazione FilmTrigger T: assegna un valore di default all’attributo valutaz, se questo non è specificato al momento dell’inserimento della tuplaIl valore di valutaz è posto uguale alla media delle valutazioni, calcolata su tutte le tuple presenti nella relazione FilmTrigger T:

Evento: inserimento nella relazione FilmCondizione: valutaz IS NULLAzione: calcolo del valor medio di valutaz ed assegnazione di tale valore all’attributo valutaz delle tuple inserite

Page 14: 07  Basi Di Dati Attive

26

Modello di esecuzioneAttività fondamentali in un ADBMS:

1. Rilevare gli eventi ed attivare i trigger corrispondenti2. Processo reattivo: selezionare ed eseguire i trigger

Possono essere eseguite concorrentemente

Possibile modello:

attività 1:While true do

seleziona eventi attiva i trigger appropriati

endWhile

27

valutazione

selezioneModello di esecuzioneattività 2:

While ci sono trigger da considerare Do(1) seleziona un trigger T(2) valuta la condizione di T(3) If la condizione di T è vera Then

esegui l’azione di T endIf endWhile esecuzione

1) Scelta di uno dei trigger attivati dall’evento2) Valutazione della condizione del trigger selezionato, il trigger

viene eliminato dall’insieme dei trigger da considerate3) Verifica condizione ed esecuzione sequenziale delle operazioni

nell’azione

Page 15: 07  Basi Di Dati Attive

28

Processo reattivo

L’esecuzione di un trigger può provocare nuovi eventi che possono a loro volta attivare altri triggerTali trigger possono:

Essere aggiunti all’insieme di trigger da considerare (modalità iterativa)Possono dar origine ad una nuova esecuzione dell’algoritmo durante l’esecuzione dell’azione del trigger correntemente attivato (modalità ricorsiva)

29

Processo reattivo

Il processo reattivo è influenzato da molti fattori:Granularità di attivazioneModalità di esecuzione dei triggerCoupling mode ConflittiTerminazione

Page 16: 07  Basi Di Dati Attive

30

Granularità del processo reattivoFrequenza di attivazione del processo reattivoGranularità comuni:

Sempre, non appena un evento si verificaDopo l’esecuzione di un comando SQLAl termine di ogni transazione

Maggiore è la granularità, maggiore sarà il numero di trigger da considerare durante il processo reattivoLa selezione del trigger avviene mediante una priorità

31

PrioritàPriorità:

AssolutaRelativaAssegnate dall’utenteDeterminate implicitamente dal sistema

Calcolate in base a:Proprietà statiche (es. momento della creazione)Proprietà dinamiche (es. trigger attivato più/meno di recente)

Per ragioni di efficienza, spesso i DBMS commerciali utilizzano priorità assolute basate su proprietà statiche

Page 17: 07  Basi Di Dati Attive

32

Esempio

Transazione:1. Inserisce un insieme di film nella relazione Film

mediante un singolo comando INSERT2. Inserisce un insieme di video nella relazione

Video per i film inseriti al punto (1), mediante un singolo comando INSERT, ma solo se la valutazione dei film contenuti è > 2, altrimenti i video non vengono inseriti in quanto si assume che il film non riscuoterà successo

33

EsempioGranularità “sempre”:

Eventi: esecuzione comandi SQL:Processo reattivo: dopo l’esecuzione di (1) e dopo l’esecuzione di (2)

Eventi: operazioni che coinvolgono singole tuple:Processo reattivo: una volta per ogni film e video inserito

Granularità “comando SQL”Processo reattivo: dopo l’esecuzione di (1) e dopo l’esecuzione di (2)

Granularità “transazione”:Processo reattivo: al commit della transazione

Page 18: 07  Basi Di Dati Attive

34

Esecuzione dei trigger

Due modalità:Orientata all’istanza (instance oriented): il trigger selezionato è eseguito una volta per ogni tupla coinvolta nell’evento che attiva il trigger e soddisfa la condizioneOrientata all’insieme (set oriented): il trigger è eseguito una sola volta per tutte le tuple coinvolte nell’evento

Possono esserci differenze nel risultato

35

Esecuzione dei trigger

Trigger T visto in precedenza: Azione: assegnare un valore di defaultall’attributo valutaz se questo non è specificato al momento dell’inserimento della tuplaIl valore dell’attributo valutaz è posto uguale alla media delle valutazioni calcolata su tutte le tuplepresenti nella relazione FilmComando SQL che inserisce 5 tuple in Film

Page 19: 07  Basi Di Dati Attive

36

Esecuzione dei trigger

Esecuzione orientata all’insieme: tutti i 5 film inseriti avranno lo stesso valore per l’attributo valutazEsecuzione orientata all’istanza: i 5 film inseriti avranno valori dell’attributo valutazpotenzialmente diversi perché la media è calcolata su insiemi differenti di valori

37

Riprendiamo il processo reattivo

While ci sono trigger da considerare Do(1) seleziona un trigger T(2) valuta la condizione di T(3) If la condizione di T è vera Then

esegui l’azione di T endIf endWhile

Page 20: 07  Basi Di Dati Attive

38

Processo reattivoEsecuzione orientata all’insieme: i passi (2) e (3) vengono eseguiti una sola volta, per l’insieme di tuple coinvolte nell’evento che ha attivato il trigger selezionato al passo (1). L’insieme delle tuple aggiornate dall’evento viene chiamato tabella di transizioneEsecuzione orientata all’istanza: i passi (2) e (3) vengono eseguiti una volta, per ogni tupla coinvolta nell’evento che ha attivato il trigger selezionato al passo (1). La tupla coinvolta nell’evento viene chiamata variabile o tupla di transizione

39

Coupling mode

Specificato per regolare la relazione tra:Evento e condizione: quando devo testare la condizione rispetto all’accadere dell’evento? Subito, alla fine della transazione che genera l’evento…Condizione ed azione: quando devo eseguire l’azione rispetto alla valutazione della condizione? Appena la condizione è verificata, alla fine della transazione corrente, …

Page 21: 07  Basi Di Dati Attive

40

Coupling modePossibilità:

Immediato: immediatamente nella stessa transazioneDifferito: al momento del commit della transazione corrente Separato: in una nuova transazione

Modalità differita:Utile per trigger che modellano vincoli di integritàDurante l’esecuzione, una transazione potrebbe violare un vincolo ma prima del commit potrebbe ripristinare uno stato consistente

Modalità separata:Utile in presenza di molti trigger da attivare

41

Coupling mode

Tra evento e condizione (modalità CA immediata)

Page 22: 07  Basi Di Dati Attive

42

EsempioConsideriamo il trigger relativo all’attributo valutazvisto in precedenza e la transazione T1 che:

1. Inserisce un insieme di film mediante un unico comando INSERT

2. Inserisce con un unico comando di INSERT un insieme di video relativi ai film inseriti al punto (1), ma solo se la valutazione dei film in essi contenuti è maggiore di 2Granularità processo reattivo: singolo comando, coupling mode CA immediato

43

EsempioT1 inserisce il film Kill Bill I di Quentin Tarantino per cui non è specificata la valutazioneCoupling mode EC:

Immediato: Il trigger viene eseguito prima del passo (2) della transazione, viene assegnato all’attributo valutaz il valor medio delle valutazioni dei film presenti nella base di dati, supponiamo pari a 2.5Viene eseguito il passo (2) ed eventuali video relativi al film Kill Bill I vengono inseriti nella tabella Video

Page 23: 07  Basi Di Dati Attive

44

EsempioCoupling mode EC:

Differito:Il passo (2) della transazione viene eseguito prima dell’esecuzione del triggerEssendo il valore dell’attributo valutaz della tupla inserita uguale a NULL, eventuali video relativi a Kill Bill I non vengono inseritiLa valutazione del film Kill Bill I viene modificata dal trigger al termine della transazioneIn caso di errore durante l’esecuzione dell’azione del trigger, i film ed i video inseriti dalla transazione verranno rimossi in seguito al rollback della transazione

45

Esempio

Coupling mode EC:Separato:

Comportamento analogo al caso precedenteL’unica differenza è che in caso di errore durante l’esecuzione dell’azione del trigger, i film ed i video inseriti dalla transazione non vengono rimossi, in quanto inseriti da una transazione separata. Non sarà però aggiornato il valore dell’attributo valutaz

Page 24: 07  Basi Di Dati Attive

46

TerminazioneIl processo reattivo potrebbe non terminareSoluzioni possibili:

Lasciare al progettista il compito di progettare i trigger in modo che sia assicurata la terminazione Fissare un limite superiore al numero massimo di trigger che possono essere attivatiRestrizioni sintattiche sui trigger per garantire la terminazione:

I trigger non possono attivarsi a vicendaI trigger possono attivarsi a vicenda ma non formando cicliI trigger possono formare cicli ma si garantisce che la condizione di qualche trigger, prima o poi, diventi falsa

Trigger in SQL

Page 25: 07  Basi Di Dati Attive

48

Creazione trigger

CREATE TRIGGER <nome trigger>{BEFORE | AFTER} <evento> ON <tabella soggetto>[REFERENCING { OLD [ROW] AS <variabile> |

NEW [ROW] AS <variabile> |OLD TABLE AS <variabile> | NEW TABLE AS <variabile> }]

[FOR EACH {ROW | STATEMENT}][WHEN <condizione>]{<comando SQL> | BEGIN ATOMIC <sequenza di comandi SQL> END} ;

49

EventoPossibili eventi: INSERT, DELETE, UPDATE, UPDATE [OF <lista attributi>] per la tabella soggettoSe si specifica UPDATE OF a1,…,an, il trigger viene attivato solo da un evento che modifica tutti e soli gli attributi a1,…,anUn solo evento può attivare un trigger, quindi non sono possibili eventi compostiE’ possibile specificare che il trigger sia attivato prima (before) o dopo (after) l’esecuzione dell’operazione associata all’evento

Page 26: 07  Basi Di Dati Attive

50

Clausola REFERENCING

La clausola REFERENCING permette di specificare alias a livello di tabella o tupla di transizioneLa parola chiave OLD permette di specificare alias per la tabella/tupla di transizione esistente prima dell’esecuzione dell’evento, NEW per quella esistente dopo l’esecuzione dell’evento

51

Condizione ed azioneCondizione:

Espressione booleana SQL arbitraria

Azione:Un singolo comando SQLUna sequenza di comandi SQL Non possono contenere parametri di connessione

Condizione e azione possono essere eseguite:FOR EACH ROWFOR EACH STATEMENT (default)

Page 27: 07  Basi Di Dati Attive

52

Clausola REFERENCING

Quali tuple sono visibili durante la valutazione della condizione e l’esecuzione dell’azione?Dipende:

Dall’evento che ha attivato il trigger Dal tipo di trigger (before/after)Dal tipo di esecuzione (row/statement)

53

Clausola REFERENCING

Le tuple di transizione sono visibili solo per esecuzioni orientate alle istanzePer trigger di tipo BEFORE, la tabella di transizione non è mai visibile (ma in caso di esecuzione orientata all’istanza è visibile la tupla di transizione)

Page 28: 07  Basi Di Dati Attive

54

Clausola REFERENCINGSe l’evento è INSERT:

Non si possono specificare clausole REFERENCING OLD in quanto le tuple inserite dall’evento non esistevano prima dell’evento stessoSe il trigger è di tipo BEFORE, le tuple inserite non sono visibili nella tabella soggetto ma possono essere accedute usando la clausola REFERENCING NEW (a livello di tupla o tabella)Se il trigger è di tipo AFTER, le tuple inserite sono anche visibili nella tabella soggetto

55

Clausola REFERENCINGSe l’evento è DELETE:

Non si possono specificare clausole REFERENCING NEW in quanto le tuplecancellate dall’evento non esistono più dopo l’esecuzione dell’eventoSe il trigger è di tipo BEFORE, le tuple cancellate sono visibili nella tabella soggetto è possono essere accedute anche usando la clausola REFERENCING OLD (a livello di tupla o tabella)Se il trigger è di tipo AFTER le tuple cancellate non sono visibili nella tabella soggetto

Page 29: 07  Basi Di Dati Attive

56

Clausola REFERENCING

Se l’evento è UPDATE:I valori precedenti e correnti delle tuple possono essere acceduti usando le clausole REFERENCING OLD e NEW (a livello di tupla o tabella)Se il trigger è di tipo AFTER, l’effetto della modifica è visibile anche nella tabella soggetto

57

Azione

Nel caso di trigger di tipo BEFORE, SQL sconsiglia l’esecuzione di comandi di aggiornamento dei dati nel contesto dell’azione, ma non lo vietaUn trigger di tipo BEFORE potrebbe aggiornare alcuni dati prima dell’esecuzione dell’evento che ha attivato il trigger, generando comportamenti anomali

Page 30: 07  Basi Di Dati Attive

58

EsempioCREATE TRIGGER ModificaValNullAFTER INSERT ON FilmREFERENCING NEW TABLE AS NTFOR EACH STATEMENTWHEN EXISTS(SELECT *

FROM NTWHERE valutaz IS NULL)

UPDATE FilmSET valutaz = (SELECT AVG(valutaz) FROM Film)WHERE (titolo,regista) IN (SELECT titolo,regista FROM NT);

59

EsempioCREATE TRIGGER ModificaValNullAFTER INSERT ON FilmREFERENCING NEW ROW AS NRFOR EACH ROWWHEN (NR.valutaz IS NULL)UPDATE FilmSET valutaz = (SELECT AVG(valutaz) FROM Film)WHERE titolo = NR.titolo AND regista = NR.regista;

Il risultato dei due trigger può essere diverso

Page 31: 07  Basi Di Dati Attive

60

Cancellazione trigger

DROP TRIGGER <nome trigger>;

61

Modello di esecuzioneGranularità: comando SQLDue modalità di esecuzione:

FOR EACH ROW FOR EACH STATEMENT (default)

Scelta trigger, dipende:Dal tipo di trigger (before/after)Dalla modalità di esecuzione (row/statement)Dalla priorità. Si associano priorità assolute in base al tempo di creazione: un trigger “vecchio” è eseguito prima di un trigger “giovane”

Page 32: 07  Basi Di Dati Attive

62

Modello di esecuzione

Possono esistere vincoli specificati per la tabella soggettoL’esecuzione degli eventi può violare i vincoli, questo implica che nel determinare l’ordine di esecuzione è necessario considerare anche il controllo dei vincoli

63

Modalità di esecuzioneLa valutazione avviene secondo il seguente ordine:

Trigger BEFORE, FOR EACH STATEMENTPer ogni tupla oggetto del comando che rappresenta l’evento:

Trigger BEFORE, FOR EACH ROW:Esecuzione evento per la singola tuplaVerifica dei vincoli di integrità sulla tupla, con valutazione immediata

Trigger AFTER, FOR EACH ROWVerifica dei vincoli con valutazione immediata sulla tabellaTrigger AFTER, FOR EACH STATEMENT

Page 33: 07  Basi Di Dati Attive

64

Terminazione

Lo standard non fornisce indicazioni su questo aspettoNon vengono poste restrizioni sintattiche per evitare la non terminazioneI DBMS commerciali di solito fissano un limite superiore al numero di trigger attivabili ricorsivamente

Trigger: esempi di utilizzo

Page 34: 07  Basi Di Dati Attive

66

Trigger e vincoliI trigger sono più flessibili dei vincoli di integrità, infatti permettono di stabilire come reagire ad una violazione di un vincoloTramite trigger è inoltre possibile specificare vincoli di transizioneLa flessibilità non sempre è un vantaggioA volte definire dei vincoli è più vantaggioso:

Migliore ottimizzazioneMeno errori di programmazioneI vincoli sono parte dello standard da lungo tempo, i trigger no

67

Vincoli di integrità

Ogni cliente non può noleggiare più di tre video contemporaneamente:

CREATE ASSERTION VerificaNoleggi CHECK (NOT EXISTS

(SELECT * FROM Noleggio WHERE dataRest IS NULL GROUP BY codCli HAVING COUNT(*) > 3));

Page 35: 07  Basi Di Dati Attive

68

Vincoli di integrità

Ogni cliente non può noleggiare più di tre video contemporaneamente:

CREATE TRIGGER VerificaNoleggi AFTER INSERT ON Noleggio REFERENCING NEW ROW AS NR FOR EACH ROW WHEN (SELECT COUNT(*)

FROM Noleggio WHERE dataRest IS NULL AND

codCli = NR.codCli) > 3 ROLLBACK;

69

Vincoli di integrità

Ogni cliente non può noleggiare più di tre video contemporaneamente:

CREATE TRIGGER VerificaNoleggi AFTER INSERT ON Noleggio REFERENCING NEW ROW AS NR FOR EACH ROW WHEN (SELECT COUNT(*)

FROM Noleggio WHERE dataRest IS NULL AND

codCli = NR.codCli) > 3 ROLLBACK;

Page 36: 07  Basi Di Dati Attive

70

Vincoli di integritàVincolo precedente, invece di abortire la transazione se il vincolo è violato si vuole annullare l’inserimento:

CREATE TRIGGER VerificaNoleggi AFTER INSERT ON Noleggio REFERENCING NEW ROW AS NR FOR EACH ROW WHEN (SELECT COUNT(*)

FROM Noleggio WHERE dataRest IS NULL AND codCli = NR.codCli) > 3

DELETE FROM NoleggioWHERE colloc = NR.colloc AND dataNol = NR.dataNol;

71

Vincoli di integritàCREATE TRIGGER VerificaNoleggiAFTER INSERT ON Noleggio REFERENCING NEW TABLE AS NT FOR EACH STATEMENT WHEN EXISTS

(SELECT * FROM Noleggio WHERE Noleggio.dataRest IS NULL AND

Noleggio.codCli IN (SELECT codCli FROM NT) GROUP BY codCli HAVING COUNT(*) > 3)

DELETE FROM NoleggioWHERE (colloc,dataNol) IN (SELECT colloc, dataNol FROM NT) AND codCli IN (SELECT codCli

FROM Noleggio WHERE Noleggio.dataRest IS NULL AND

Noleggio.codCli IN (SELECT codCli FROM NT) GROUP BY codCli HAVING COUNT(*) > 3);

Page 37: 07  Basi Di Dati Attive

72

Calcolo di dati derivati

Aggiornamento automatico attributo ptiMancanti nella tabella StandardNoleggio VHS: 1 puntoNoleggio DVD: 2 punti

73

Calcolo di dati derivatiCREATE TRIGGER CalcolaPtiMancanti AFTER INSERT ON Noleggio REFERENCING NEW ROW AS NR FOR EACH ROW BEGIN ATOMIC

UPDATE Standard SET ptiMancanti = ptiMancanti - 1 WHERE codCli = NR.codCLI AND

NR.colloc IN (SELECT colloc FROM Video WHERE tipo = 'v');

UPDATE Standard SET ptiMancanti = ptiMancanti - 2 WHERE codCli = NR.codCLI AND

NR.colloc IN (SELECT colloc FROM Video WHERE tipo = 'd');

END;

Page 38: 07  Basi Di Dati Attive

74

Regole operative

Quando il valore dell’attributo ptiMancanti per un cliente standard diventa 0, il cliente è rimosso dalla tabella Standard ed inserito nella tabella VIP con bonus pari a 5 euro:

CREATE PROCEDURE OrganizzaClienti() BEGIN

INSERT INTO VIP SELECT codCli, 5.00 FROM Standard WHERE ptiMancanti <= 0; DELETE FROM Standard WHERE ptiMancanti <=0;

END;

75

Regole operative

CREATE TRIGGER OrganizzaClienti AFTER UPDATE OF ptiMancanti ON Standard REFERENCING NEW ROW AS NR FOR EACH ROW WHEN NR.ptiMancanti <= 0 BEGIN ATOMIC

INSERT INTO VIP VALUES (NR.codCli,5.00); DELETE FROM Standard WHERE codCli = NR.codCli;

END;