• Non ci sono risultati.

Trig ge r

N/A
N/A
Protected

Academic year: 2021

Condividi "Trig ge r"

Copied!
29
0
0

Testo completo

(1)

Ba si d i d ati att ive

Ba si d i d ati att ive

Una base di dati attiva

dispone di un sottosistema integrato per definire e gestireregole di produzione

reagisce autonomamente a eventi eseguendo azioni

dispongono di un processore di regole (ruleengine)

integra nello schema parte della business logic

altrimenti, tale conoscenza dovrebbe essere implementata da programmi applicativi

il vantaggio èl’indipendenza della conoscenza (che si aggiunge all’indipendenza logica e fisica)

(2)

Trig ge r

I trigger

definiscono regole in SQL

Adottano lo schema ECA (EventConditionAction)

ON eventoIF condizioneTHEN azione

1.se si verifica l’evento, si valutata la cndizione

2.se la condizione èsoddisfatta l’azione viene eseguita

gli eventicorrispondono alle primitive DML di SQL: insert, update, delete

la condizioneèun’espressione SQL

l’azioneèuna sequenza di primitive SQL eventualmentearricchite da un linguaggio di programmazione

Trig ge r in SQ L-9 9

I trigger sono stati definiti formalmente da SQL-99 (SQL3)

I DBMS commerciali usano versioni proprietarie dei trigger nateprima di SQL-99Ogni trigger ècaratterizzato da

nome

nome della tabella che viene monitorata

modo di esecuzione (BEFORE o AFTER)

l’evento monitorato (INSERT, DELETE o UPDATE)

granularità

nomi e alias per transitionvaluese transitiontables

l’azione

il timestampdi creazione

(3)

Sin tas si trig ge r S QL -9 9 cre ate trig ger

NomeTrigger{

befo re

|

afte r

}{

inse rt

|

dele te

|

upd ate

[

of

Colonne] }

on

Tabella[

refe ren cin g

{[

old tab le

[

as

] AliasTabellaOld][

new tab le

[

as

] AliasTabellaNew] } |{[

old

[

row

] [

as

] NomeTuplaOld][

new

[

row

] [

as

] NomeTuplaNew] }][

for e ach

{

row

|

sta tem ent

}][

wh en

Condizione]ComandiSQL

Trig ge r: m od o di e se cu zio ne

Modo di esecuzione

Un trigger può essere eseguito inmodalitàdiverse che dipendono dall’implementazione (dal DBMS)

immediata, cioèprima del commitdell’evento (usata daSQL-99)

differita, al momento del commit

separata, dopo il commit

Nell’esecuzione immediata e differitaun rollbacknel trigger causa un rollbackdell’evento transazioneutenteprocessotrigger Immediata

processotrigger Differita

processotrigger Separatatransazioneutente transazioneutente

commit commit

(4)

Trig ge r: m od o di e se cu zio ne

Un trigger eseguito in modalitàimmediata può essere eseguito

prima dell’evento (opzione before)

dopo l’evento (opzione after)

alcune implementazioni permettono anche “insteadof”che indica che il trigger deve essere eseguito invece del comando:

tali implementazioni sono poche perchéla semantica che ne risultapuò essere poco intutiva

Trig ge r: g ran ula rità e c on diz ion e

Granularità(row, statement)

definisce quante volte viene attivato

row-level: attivazione per ogni ennupla coinvolta nell'operazione

statement-level: una sola attivazione per ogni istruzione SQL, conriferimento a tutte le ennuple coinvolte (“set-oriented”)Condizione

la condizione èuna espressione logica che restringe il campo di applicazione della regola

(5)

Trig ge r: a zio ne

L’azione

contiene un singolo comando o una sequenza di comandi

in SQL-99, ORACLE e MSSQL SERVER mettono a disposizione un linguaggio proprio per scrivere la sequenza di comandi

Nei trigger before, l’azione può contenere definizione di dati, selezioni di dati …ma non può modificare lo stato della base di dati

Nei trigger after, l’azione può contenere anche operazioni di manipolazione dei dati (INSERT, DELETE, UPDATE)

Trig ge r: a lia s

Alias delle tabelle o tuple che contengono i valori prima e dopola modifica

il trigger può accedere a tabelle (tuple) che contengono copie dei dati prima e dopo la modifica

in SQL-99 èpossibile dare un nuovo nome alle tabelle (tuple) che contengono i nuovi e i vecchi dati

le tabelle (tuple) accessibili dipendono dal tipo di trigger

insert, updatedelete, updateinsert, updatedelete, updateafterrow insert, updatedelete, update--afterstatement -insert, updatedelete, updatebeforerow ---beforestatement NEW TABLEOLD TABLENEW ROWOLD ROW

-

-

(6)

Os se rva zio ne

In intelligenza artificiale si usano spesso regole con condizioni ma senza eventi, perchénei trigger si usano anche gli eventi?

l’evento èvalutabile facilmente e a basso costo

questo vantaggio èimportante nella basi di dati dove spesso si opera su una grande quantitàdi dati

inoltre, posso specificare azioni diverse per eventi diversi e stessa condizione

Es em pio : b efo re

create trigger LimitaAumentibefore update of salarioonImpiegatifor each rowwhen New.salario> 1.2*Old.salarioset New.salario=1-2*Old.salario tabellechedi defaultcontengonoi datiprima e dopole modifche

(7)

Es em pio : a fte r

cre ate trig ger

LimitaAumenti

afte r up date of

salario

on

Impiegati

for e ach ro w wh en

New.salario> 1.2*Old.salario

upd ate

Impiegati

set

Impiegati.salario=1.2 * Impiegati.salario

wh ere

Impiegati.id=New.id

Es em pio : g ran ula rità sta tem en t

cre ate trig ger

LimitaAumenti

afte r up date of

salario

on

Impiegati

for e ach sta tem ent inse rt in to

LogSalari(Current_date,

sele ct

AVG(salario)

fro m

Impiegati)

(8)

Pro ce sso di e se cu zio ne de itr igg er

I passi del processo di esecuzione dei trigger sono1.Il nucleo del DBMS individua un evento2.Viene istanziato il corpo delle regole attivate3.Si sceglie un ordine di esecuzione delle regole4.Si verifica la condizione delle regole5.Si eseguono le regole:se durante l’esecuzione si verificano nuovi eventi si va a 2

Ord ine di e se cu zio ne de itr igg er e vi nc oli in S QL -9 9

Ordine di esecuzione trigger di tipo diverso e vincoli1.trigger BEFORE STATEMENT2.per ogni tupla oggetto del comando3.trigger BEFORE ROW4.comando e verifica dei vincoli di integritàper righe5.trigger AFTER ROW6.verifica dei vincoli che richiedono di aver completato il comando7.trigger AFTER STATEMENTOrdine di esecuzione trigger dello stesso tipo

se esiste piùdi un trigger dello stesso tipo, si usa l’ordine di creazione

(9)

Pro prie tà di i ns iem e di t rig ge r

L’attivazione di un trigger può determinare in cascata l’attivazione di altri trigger

L’attivazione di un trigger può causare un rollbackche, in cascata e a seconda dell’implementazione del DBMS, può determinare ilrollbackdelle modifiche dell’evento e di altre regole

Mentre il comportamento di ogni singola regola èfacile da comprendere, il comportamento di un insieme di regole può essere piùdifficile da capire

Pro prie tà di i ns iem id i tr igg er

Le proprietàpiùinteressanti sono la terminazione, la confluenza el’osservabilitàdeterministicaTerminazione

insieme di regole termina se nessun evento può determinare un’attivazione ciclica delle regoleConfluenza

un insieme di regole èconfluente se per ogni evento l’insieme di regolescatenate porta allo stesso stato finale indipendentemente dall’ordine di attivazioneDeterminismo delle osservazioni

insieme di regole garantisce il determinismo delle osservazioni se per ogni evento l’esecuzione delle regole èconfluente e le azioni visibili delle regole sono sempre le stesse e sono svolte nello stesso ordine

(10)

Pro prie tà di i ns iem id i tr igg er

In teoria

La terminazione èessenziale, mentre confluenza e determinismo delle osservazioni sono desiderabili, ma non necessarie

Nessuna delle proprietàpuò essere verificata automaticamenteIn pratica, i DBMS

definiscono dei limiti per il numero di trigger o la profonditàdellaricorsione che può essere attivata da un evento

definiscono un ordine con cui i trigger relativi ad un evento sono attivati: ad esempio, tempo di creazione, nome

Os se rva zio ne

Per visualizzare l’interazione fra trigger si può definire il grafo di attivazione dove

ogni nodo corrisponde ad una regola

gli archi indicano le dipendenze

Si osservi che la presenza di cicli nel grado non significanecessariamente che le regole non terminano

T1

T2 T3

(11)

Es em pio di r eg ola co n g raf o cic lico

create trigger LimitaAumentiafter update of salarioon Impiegatifor each row updateImpiegatisetImpiegati.salario=0.9 * Impiegati.salariwhere(selectAVG(salario) fromImpiegati)>100create trigger LimitaAumentiafter update of salarioon Impiegatifor each row updateImpiegatisetImpiegati.salario=1.1 * Impiegati.salariwhere(selectAVG(salario) fromImpiegati)>100 T

Termina

Non termina

Es ten sio ni

I trigger possono avere diverse (rare) estensioni

eventi temporali (anche periodici) o “definiti dall’utente”

combinazioni booleane di eventi

definizione di priorità

regole a gruppi, attivabili e disattivabili

regole associate anche a interrogazioni

regole associate a comandi di creazione e modifica dello schema,assegnazione di diritti, creazione e modifica di procedure, …

(12)

Ap plic azio ni de itr igg er

I trigger possono essere usati per

regole esterne che implementano parti di applicazioni

regole interne ai DBMS

replicazione, integritàreferenziale, alerting, sicurezza, statistiche, vistematerializzate, …

si osservi che tali regole possono essere a sua volta suddivise in

regole del nucleo del DBMS

regole che espandono le funzionalitàdel DBMS

le regole interne sono tipicamente generate automaticamenree possono essere o non essere visibili all’utente

Trig ge r in O rac le, DB 2, M SS SQ L e po stg res s

PostgreSQLimplementa un sottoinsieme dei trigger SQL-99 e la sintassi si attiene ampiamente allo standard

DB2 differisce in pochi punti rispetto allo standard: fra colorochehanno definito SQL-99 c’erano diversi progettisti IBM

La sintassi di dei trigger in Oracle molto simile a SQL-99 con alcune differenze e diverse funzioni in più

In MSSQL server la sintassi ècompletamente diversa

(13)

Sin tas si trig ge r M SS QL se rve r

create triggertrigger_name

on

{ table| view}

{ fo r

|

afte r

|

inst ead of }

{ [

inse rt

] [

,

] [

upd ate

] [,] [

dele te

] }

as

[

if u pda te (

column

)

[ {

and

|

or

}

upd ate (

column

)

]] sql_statement

Trig ge r in M SS QL se rve r

Particolaritàdi MSSQL server

MSSQL server adotta l’esecuzione immediata e permette di scegliere fra la modalità

Afte r

e quella “

inst ead of

”(beforenonèdisponibile)

La condizione

wh en

èsostituita da un controllo sulla modifica di colonne

La clausola

refe ren ce

non esiste: le tabelle

inse rted

e

dele ted

sono disponibili di default

Non èpossibile scegliere la granularità: i trigger vengono eseguiti con granularitàstatement

L’azione può essere scritta con il linguaggio TRANSACT-SQL

(14)

Es erc izio 1

Creare una tabella studenti con attributi: nome e id

Creare una tabella esami con attributi; studente, voto, lode, corso e id

Creare un trigger che implementa il vincolo per cui non ammesso un voto con la lode diverso dal 30 e il voto deve essere compreso fra 1 e 30

Tra ns act -S QL

Variabili

le variabili sono iniziano con il simbolo @

devono essere dichiarate con il comando DECLARE @nome_variabile tipoil tipo può essere uno qualsiasi di quelli usabili in SQL eccetto

tex t

,

nte xt

o

im age

possono essere assegnate e aggiornate usando il comando SET

dec lare

@contatoreint

set

@contatore=1

set

@contatore=@contatore+1

(15)

Tra ns act -S QL

Controllo di flusso

per controllare il flusso sono disponibili leistruzioni IF, FOR e WHILE



if

(condition)

the n

[ statements ]

[

else

[ elsestatements] ]



wh ile

(expression)

{ statements |

bre ak

|

con tinu e

}Blocchi

insiemedi istruzionisonoracchiusifra

beg in

e

end

declare @b intset @b=10while (@b>0)beginprint @bset @b=@b-1end

Tra ns act -S QL

Errori e rollback

l’istruzione raiserrorpermette di segnalare al sistema che siamo in presenza di un errore

rais erro r

(‘messaggio’,livello,stato)

il livello dell’errore èuna valore fra 1 e 25. Se l’errore èmaggiore di 10, il batchcorrispondente viene fermato e si fa il rollbackdella transazione corrispondente

lo stato èun valore fra 1 e 128 e serve definire in che stato del codicein esecuzione si èverificato l’errore

(16)

So luz ion e ese rciz io 1: vi nc olo int rar ela zio na le cre ate trig ger

trigger1 onesami

afte rup date , in sert as beg in if

(

exis ts

(

sele ct

*

from

inserted

wh ere

voto<>30

and

lode='true' ))

beg in

raiserror(‘Vincolo sulla lode non rispettato',11,1)

end end

Es erc izio 2

Implementare il seguente vincolo nella tabella esami

Si ricordi che il vincolo impone dei vincoli sia sui valori dellatabella studenti che in quella esami studente

int refe ren ces

studenti(id)

on d ele te cas cad e

(17)

So luz ion e ese rciz io 2: vi nc olo int err ela zio na le cre ate trig ger

trigger2

on

studenti

afte rde lete beg in dele te f rom

esami

wh ere

esami.studente

in ( sele ct

id

fro m

deleted

) end

So luz ion e ese rciz io 2 cre ate trig ger

trigger3onesami

afte rup date , in sert as beg in if

(

exis ts

(

sele ct

*

from

inserted

wh ere

inserted.studentenotin (selectidfromstudenti)))

beg in

raiserror(‘Vincolo referenziale non rispettato',11,1)

end end

(18)

Es erc izio 3: cre are un lo g

definire dei trigger che si attivano in corrispondenza dellemodifiche della tabella studenti e registrano in un’altra tabella: timestamp, tipo di operazione, id,beforeimagee afterimagedel campo nome

si assuma che l’idnon sia modificato

3 2 id

…..…… plutoputoupdate1-1-08.. putoinsert1-1-08… afterbeforeoperazionetime

So luz ion e ese rciz io 3 cre ate trig ger

trigger4onstudenti

afte rde lete as beg in inse rtin to

log(time,azione,id,before,after)

sele ct

current_timestamp,'delete',deleted.id,deleted.nome,null

from

deleted

end

(19)

So luz ion e ese rciz io 3 cre ate trig ger

trigger6 onstudenti

afte rup date as beg in inse rtin to

log(time,azione,id,before,after)

sele ct

current_timestamp,'update',deleted.id,deleted.nome,inserted.nome

from

inserted, deleted

wh ere

inserted.id = deleted.id

end

So luz ion e ese rciz io 3 cre ate trig ger

trigger4onstudenti

afte rde lete as beg in inse rt

into log(time,azione,id,before,after)

sele ct

current_timestamp,'delete',deleted.id,deleted.nome,null

from

deleted

end

(20)

Es erc izio 4

Inserire nella tabella studenti un campo media e definire dei trigger che aggiornano automaticamente il campo quando si modificano gli esami

si tenga presente che se un trigger viene eseguite in modalità

afte r

, al tempo di esecuzione la tabella su cui opera appare giàmodificata

So luz ion e ese rciz io 4 cre ate trig ger

trigger7onstudenti

afte rde lete , in sert , up date as beg in upd ate

studenti

set

media=(

sele ct

avg(voto)

fro m

esami

wh ere

studenti.id=esami.studente)

wh ere

studenti.id in (

sele ct

deleted.studente

from

deleted)or studenti.id in (

sele ct

inserted.studente

from

inserted)

end

(21)

Sto red pr oc ed ure

Storedprocedure (functions)

sono procedure (funzioni) che vengono memorizzate ed eseguite direttamente dal DBMS

sono scritte in linguaggi proprietari oppure in linguaggi tradizionali conSQL embeddedVantaggi (rispetto all’implementazione del codice sul client)

se la procedura serve a diverse applicazioni, si riduce la duplicazione

si riduce le comunicazioni fra i client

si incrementa la capacitàdi rappresentazione delle viste

si possono memorizzare sul server le procedure di manutenzione, …

il DBMS può precompilare le procedure preparando il piano di accesso per ciascuna interrogazione contenuta

Sto red pr oc ed ure

Svantaggi

siappesantisceilserver

le procedure non sonoportabiliperchèogniserver ha ilsuolinguaggio

(22)

Sin tas si pro ce du re TR AN SA CT -S QL cre ate pro ced ure

procedure_name{ { @parameter data_type} [ =

defa ult

] [

out put

] [

rea don ly

] }

as

sql_statement---

exe cute

{[ @return_status= ] procedure_name[ [ @parameter = ] { value |@variable [

out put

]| [ default]}]

Sto red pr oc ed ure : o sse rva zio ni

le procedure possono restituire una o piùtabelle temporanee che possono essere accedute da client e da altre procedure

si osservi che sebbene esistano dei parametri di output, questi non possono contenere tabelle: le tabelle restituite dalle proceduresono quelle che corrispondono alle selectdella procedura …. vedremo comesi accede a questi dati

(23)

Es em pio

cre ate pro ced ure

procedura1

@

nome

varc har (10 ) as beg in sele ct

corso,voto

from

esami, studenti

wh ere

studenti.id=esami.studente

and

studenti.nome = @nome

end ---- ---- --- exe c

procedura1@nome='pippo‘

--- opp ure

procedura1'pippo‘

Una pro ced ura per cer care gli esa mi di u no stu den te

Es erc izio 5

Creare due procedure:

la prima dovrebbe prendere in ingresso il nome di uno studente e restituire, usando i parametri di uscita, il massimo e il minimo voto dello studente

la seconda dovrebbe visualizzare il nome dei corsi dove uno studente dato ha preso il minimo e il massimo voto

(24)

So luz ion e ese rciz io 5 cre ate pro ced ure

procedura2

@

nome

varc har (10 ), @

max

int out put , @

min

int out put as beg in sele ctm ax(

voto)

fro m

esami, studenti

wh ere

studenti.id=esami.studente

and

studenti.nome = @nome

end

So luz ion e ese rciz io 5 cre ate pro ced ure

procedura3

as beg in dec lare

@max

int

, @min

int exe c

procedura2'pippo', @max

out put ,

@min

out put end

(25)

Ta be lle tem po ran ee

TRANSACT-SQL permette la definizione di tabelle temporanee

le tabelle temporanee possono essere usate attraverso delle variabili di tipo tabella

dec lare

@t table(corso

varc har

(20),voto

int

)

inse rt in to

@t

exe c

procedura1 @nome='pippo‘

sele ct

max(voto)

from

@t

Es erc izio 6

Creare una procedura che visualizza i corsi che hanno la mediamassima e minima usando le tabelle temporanee

si osservi che questa funzionalitànon sarebbe implementabileusando una singola interrogazione SQL: serve usare delle tabelletemporanee, una vista oppure delle procedure

(26)

So luz ion e ese rciz io 6 cre ate pro ced ure

procedura4

beg in dec lare

@t table(corso

varc har

(20),media

floa t

)

inse rtin to

@t

sele ct

corso, avg(voto)

from

esami

gro up by

corso

sele ct

corso

fro m

@t

wh ere

media=(

sele ct

max(media)

from

@t)

sele ct

corso

fro m

@t

wh ere

media=(

sele ct

min(media)

from

@t)

end

Cu rso ri

I cursori

sono variabili con cui si può scorrere le righe restituite da una interrogazione: seguono la stessa idea che si ritrova, ad esempio, nei resultsetdi Java

l’uso dei cursori si ritrova nei linguaggi che estendono SQL e nelle varie versioni di embeddedSQL

il DBMS ottimizza gli accessi ai dati tramite cursori:

ad esempio, invece di recuperare per intero il risultato di una interrogazione, può accederci alle righe man mano che queste su rendono necessarie

questa strategia èparticolarmente utile se i risultati contengono moli enormi di dati

(27)

Sin tas si de ic urs ori

dec lare

cursor_name

curs or [loc al| glo bal]

[

forw ard _on ly

|

scro ll

][

sta tic

|

key set

|

dyn am ic

|

fast _fo rw ard

][

rea d_o nly

|

scro ll_lo cks

|

opti mis tic

]

for

select_statement[

for u pda te

] i cursori, in una versione semplificata, erano presenti in SQL-92

la sintassi di TRANSACT-SQL permette di specificare varie opzioni con cui si può ottimizzare l’efficienza dei cursori

Sin tas si de ic urs ori

ope n

cursor_name

clos e

cursor_name

dea lloc ate

cursor_name

fetc h

[ [

nex t

|

prio r

|

firs t

|

last

|

abs olu te

{ n |

@

nvar} |

rela tive

{ n |

@

nvar}]

from

] cursor_name[

into

{

@

variable_name}]

upd ate

table_name

set

{ column_name= expression}

from

table_name

curr ent of

cursor_name} Diverse istruzione interagiscono con i cursoriopen (apre il cursore ed esegue l’interrogazione), fetch(accede ad una riga), update (modifica una riga), close(chiude il cursore),deallocate (dealloca le strutture dati usate dal cursore)

(28)

Es em pio

cre ate pro ced ure

procedura4

beg in dec lare

a

curs or loca lfo r sele ct

studente

fro m

esami

dec lare

@lode

bit

, @voto

int ope n

a

fetc h

a

into

@voto, @lode

wh ile

@@fetch_status=0

beg in if

(@lode='true' and @voto<>30)

upd ate

esami

set

lode='false'

wh ere cu rren t of

a

fetc h

a

into

@voto, @lode

end

Es erc izio 7

Creare una procedura che controlla se c’èuna violazione del vincolo referenziale fra studenti.ide esami.studenteusando i cursori per scorrere la tabella esami

Nel caso di una violazione, si registri un evento nel log degli eventi indicando l’iddello studente, il corso e il voto

Per scrivere sul log si usi

il numero di errore deve essere maggiore o uguale a 50000

per concatenare le stringhe si usi “+”, per convertire in varcharsi usi

xp_ log eve nt

error_number, ‘message’

cas t

(@variabile

as varc har

)

(29)

So luz ion e ese rciz io 7 cre ate pro ced ure

procedura5

asbeg in dec lare

cur

curs or loca lfo r sele ct

studente, corso, voto

from

esami

dec lare

@studente

int,

@corso

varc har (10 ),

@voto

int,

@mess varchar(50)

ope n

cur

fetc h

cur

into

@studente, @corso, @voto

So luz ion e ese rciz io 7 wh ile

@@fetch_status=0

beg in if

(

not exis ts

(

sele ct

*

fro m

studenti

wh ere

studenti.id=@studente))

beg in set

@mess='violazione vincolo, studente:‘+cast(@studente as varchar)+ ',corso: '+@corso+', voto:'+ cast(@voto as varchar)

exe c

xp_logevent 50000, @mess

end fetc h

cur

into

@studente, @corso, @voto

end clos e

cur

end

Riferimenti

Documenti correlati

Il team è giovane e dinamico (età media 25 anni) e dall’incontro con i fondatori della Società con un Raimondo Mendolia, maestro pastaio di fama nazionale, nasce il brand La

5. Fermo restando l’obbligo di denuncia all’autorità giudiziaria, il dipendente segnala, in via riservata, al RPCT le situazioni di illecito o irregolarità di cui venga a

1. il saldo del prezzo, degli oneri tributari conseguenti al trasferimento e delle ulteriori spese a carico dell’acquirente, detratta la cauzione, entro 60 giorni dall’aggiudicazione

• Terminata la compilazione di tutte le sezioni, cliccare su “Conferma ed invio”, compaiono le dichiarazioni finali da rendere ed alla conclusione di queste si “Conferma

Miscuglio di sementi specifico per la realizzazione di tappeti erbosi sottoposti ad intenso calpestio in zone con clima arido e secco.Ottima capacità a rigenerarsi conferendo al

Il cammino inizia nel 1982 dalle cure a domicilio, e oggi Vidas, associazione di volontariato apartitica e aconfessionale fondata a Milano da Giovanna Cavazzoni, offre assistenza

La Camera di Commercio della Romagna - Forlì-Cesena e Rimini (in seguito anche Camera di Commercio della Romagna o Camera di Commercio), con lo scopo di sostenere l’accesso al

(b) Nei giorni scolastici (lun-ven) al ritorno effettua deviazione all’ISIS Enrico Mattei (c) All’andata deviata all’ufficio postale di Ladispoli (via Sironi). (d) Al ritorno