07 Basi Di Dati Attive
-
Upload
guestbe916c -
Category
Business
-
view
686 -
download
3
Transcript of 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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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, …
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)
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
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
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
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
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)
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)
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
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
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
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”
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
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
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));
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;
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);
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;
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;