Basi di dati attive-AD13

Basi di dati attive

Basi di dati con componente per la gestione di regole Evento-Condizione-Azione (regole di produzione). Hanno comportamento reattivo (in contrasto con passivo): eseguono non solo le transazioni utenti ma anche le regole. Le regole sono simili alle procedure, ma l’invocazione è automatica. Nell’ambito dei DBMS commerciali si parla di trigger (standardizzati in SQL-3)

Paradigma evento-condizione-azione (ECA)

• Intuitivamente:

– quando si verifica l’evento (attivazione)
– se la condizione è soddisfatta (considerazione)
– allora esegui l’azione (esecuzione)

• I trigger sono definiti con istruzioni DDL (create trigger)

– evento: modifica dei dati, specificata con insert, delete, update
– condizione (opzionale) predicato SQL
– azione: sequenza di istruzioni SQL (o estensioni, ad esempio PL/SQL in Oracle)

• Ogni trigger fa riferimento ad una tabella (target): risponde ad eventi relativi a tale tabella.

Granularità

• Granularità
– di tupla (row-level): attivazione per ogni tupla coinvolta nell’operazione.
– di operazione (statement-level): una sola attivazione per ogni istruzione SQL, con riferimento a tutte le tuple coinvolte (set-oriented)
Regola attiva

create trigger GestioneRiordino
after update of QtaDisp on Magazzino
when (new.QtaDisp < new.QtaRiord)
for each row
X exception
begin
if new.QtaDisp < 0 then raise(X);
insert into Riordino
values(new.CodProd,sysdate,new.QtaRiord)
end

Esempio: gestione automatica del riordino

1. . evento:
update(QtaDisp) in Magazzino
2. . condizione: la nuova quantità disponibile è inferiore alla (nuova) quantità di riordino:
new.QtaDisp < new.QtaRiord
3. . azione:
se la quantità disponibile è insufficiente: eccezione emissione di un ordine.

Esecuzione dell’applicazione

update Magazzino
set QtaDisp = QtaDisp – 150
where CodProd = 4

CodProd  QtaDisp   QtaRiord
 4 20 50

Esecuzione del trigger

evento : update(QtaDisp) on Magazzino
condizione : VERA
azione : if new.QtaDisp < 0 then raise(X)
non scatta
insert into Riordino values
(new.CodProd,sysdate,new.QtaRiord)

 CodProd Data  Qta 
 4 10-10-97 50

Integrità referenziale

Supponiamo che la tabella magazzino abbia oltre alla voce QtaRiord e QtaDisp anche QtaMax
rappresenti la quantità massima di un articolo che può essere immagazzinato.
Si introducono due vincoli di integrità referenziale.
– La quantità di riordino non può MAI superare la quantità massima
– La quantità disponibile non può MAI superare la quantità massima
Politiche di reazione

• Diverse sono le politiche di reazione alla violazione di uno dei due vincoli.

– Abortire la transazione
– Modificare il contenuto della quantità eccedente in modo che il valore sia inferiore o uguale al valore massimo

• Attenzione agli effetti nascosti di operazioni automatiche.

Quantità disponibile

• Realizziamo la seguente politica per la gestione della quantità disponibile
• Si impedisce la transizione
• Per cui avremo

create trigger TroppoDisp
after update of QtaDisp on Magazzino
when (new.QtaDisp > new.QtaMax)
X exeception
Raise(x)

Politiche per la quantità di riordino

La politica di reazione
– ridurre del 33% la quantità disponibile fino a quando il valore non è inferiore alla quantità massima
create trigger TroppoRiod
after update of QtaRiod on Magazzino
when (new.QtaRiod > new.QtaMax)
Update Magazzino set
QtaRiod=new.QtaRiod*0.77
Where Magazzino.CodProd=new.CodProd
Esecuzione dell’applicazione

update Magazzino
set QtaRiord = 200
where CodProd = 4

CodProd  QtaDisp   QtaRiord QtaMax 
 4 180  200  190

Descrizione

1. evento:

update(QtaRiod) in Magazzino

2. condizione: la nuova quantità di riordino è maggiore di quella massima prevista per quell’articolo
3. azione:
Si impone che la quantità di riordino sia diminuita del 33% rispetto a la valore precedente.

 Esecuzione del trigger
evento : update(QtaRiord) on Magazzino
condizione : VERA
azione : Update Magazzino set

QtaRiod=new.QtaRiod*.77
Where Magazzino.CodProd=new.CodProd
Notare che l’azione fa scatenare ancora un volta lo stesso trigger

 CodProd QtaDisp  QtaRiord  QtaMax 
 4 180 154 190

Esecuzione del trigger 2

evento : update(QtaRiord) on Magazzino
condizione : FALSA
azione : NON ESEGUITA

Conclusioni

• I trigger possono risultare utili in molti ambiti
• L’errata progettazione del trigger può portare a effetti indesiderati
• L’eccessiva proliferazione dei trigger rallenta il DBMS perché si devono controllare tutti i trigger che scattano sull’evento
• Limitazioni alla portabilità verso altri DBMS