17
1 Le Basi di Dati Attive Basi di dati: Architetture e linee di evoluzione - Seconda edizione Capitolo 5 Appunti dalle lezioni Basi di Dati 2 – Prof. Antonio d’Acierno I DB Attivi 2 SQL in Linguaggi di programmazione L’uso diretto dell’ interprete SQL è tipicamente riservato a pochi utenti esperti. L’utente generico accede alla base di dati attraverso applicazioni scritte usando linguaggi tradizionali di alto livello o speciali. I linguaggi tradizionali sono di tipo procedurale mentre SQL è un linguaggio dichiarativo. Le istruzioni SQL sono allora incapsulate nel linguaggio e passate all’ interprete tramite opportune chiamate.

Le Basi di Dati Attive - CNR 1112/Slides/08... · 2015. 6. 19. · Basi di Dati 2 – Prof. Antonio d’Acierno I DB Attivi 5 Triggers I triggers sono delle stored procedures che

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Le Basi di Dati Attive - CNR 1112/Slides/08... · 2015. 6. 19. · Basi di Dati 2 – Prof. Antonio d’Acierno I DB Attivi 5 Triggers I triggers sono delle stored procedures che

1

Le Basi di Dati Attive

Basi di dati: Architetture e linee di evoluzione -Seconda edizioneCapitolo 5

Appunti dalle lezioni

Basi di Dati 2 – Prof. Antonio d’Acierno I DB Attivi 2

SQL in Linguaggi di programmazione

� L’uso diretto dell’ interprete SQL è tipicamente riservato a pochi utenti esperti.

� L’utente generico accede alla base di dati attraverso applicazioni scritte usando linguaggi tradizionali di alto livello o speciali.

� I linguaggi tradizionali sono di tipo procedurale mentre SQL è un linguaggio dichiarativo.

� Le istruzioni SQL sono allora incapsulate nel linguaggio e passate all’ interprete tramite opportune chiamate.

Page 2: Le Basi di Dati Attive - CNR 1112/Slides/08... · 2015. 6. 19. · Basi di Dati 2 – Prof. Antonio d’Acierno I DB Attivi 5 Triggers I triggers sono delle stored procedures che

2

Basi di Dati 2 – Prof. Antonio d’Acierno I DB Attivi 3

SQL

Uso diretto

In linguaggi“classici”

Call LevelInterface

ODBC

JDBC

Stored Procedures TriggersLinguaggiad hoc

Basi di Dati 2 – Prof. Antonio d’Acierno I DB Attivi 4

Stored procedures

Page 3: Le Basi di Dati Attive - CNR 1112/Slides/08... · 2015. 6. 19. · Basi di Dati 2 – Prof. Antonio d’Acierno I DB Attivi 5 Triggers I triggers sono delle stored procedures che

3

Basi di Dati 2 – Prof. Antonio d’Acierno I DB Attivi 5

Triggers

� I triggers sono delle stored procedures che scattano in relazione ad eventi.

� Definiti a livello di standard da SQL-3, ma presenti nei sistemi (con sintassi e caratteristiche diverse) già dalla fine degli anni Ottanta.

� Attraverso i triggers realizziamo le Basi di Date attive

� Evento Condizione Azione (E-C-A)

Basi di Dati 2 – Prof. Antonio d’Acierno I DB Attivi 6

Il Paradigma E-C-A

� Evento– Una richiesta di modifica dello stato della base di dati: INSERT,

DELETE, UPDATE– Quando avviene l’evento, il trigger viene attivato

� Condizione– Un predicato che identifica le situazioni in cui è necessaria

l’applicazione del trigger

– Quando si valuta la condizione il trigger viene considerato

� Azione– Un generico comando di modifica o una stored procedure

– Il trigger viene eseguito

Page 4: Le Basi di Dati Attive - CNR 1112/Slides/08... · 2015. 6. 19. · Basi di Dati 2 – Prof. Antonio d’Acierno I DB Attivi 5 Triggers I triggers sono delle stored procedures che

4

Basi di Dati 2 – Prof. Antonio d’Acierno I DB Attivi 7

Dal punto di vista sintattico …

� I Triggers:– Sono definiti con istruzioni DDL (create trigger)– basati sul paradigma ECA:

� 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 detta target e risponde ad eventi relativi a tale tabella

� I valori di tale tabella vengono “congelati” prima e dopo l’ evento in due strutture dette di transizione.

Basi di Dati 2 – Prof. Antonio d’Acierno I DB Attivi 8

Modo e Granularità

� Modo di esecuzione– After: il trigger è considerato ed eseguito dopo l’applicazione

sulla base dati dell’azione che lo ha attivato– Before: il trigger è considerato ed eseguito prima della

applicazione alla base dati dell’azione che lo ha attivato– Instead: il trigger è considerato al posto dell’azione che lo ha

attivato

� Granularità– di tupla (row - level):

� attivazione per ogni tupla della tabella target coinvolta nell'operazione

– di operazione (statement - level): � una sola attivazione per ogni istruzione SQL, con riferimento a tutte

le ennuple della tabella target coinvolte (“set-oriented”)

Page 5: Le Basi di Dati Attive - CNR 1112/Slides/08... · 2015. 6. 19. · Basi di Dati 2 – Prof. Antonio d’Acierno I DB Attivi 5 Triggers I triggers sono delle stored procedures che

5

Basi di Dati 2 – Prof. Antonio d’Acierno I DB Attivi 9

Trigger: esempio

� Warehouse(Part,QtyAvbl,QtyLimit,QtyReord)� PendigOrders(Part,Qty,Date)

Basi di Dati 2 – Prof. Antonio d’Acierno I DB Attivi 10

Trigger: esempio

create trigger Reorderafter update of QtyAvbl on WAREHOUSEfor each rowwhen (new.QtyAvbl < new.QtyLimit) declare X number;begin

select count(*) into Xfrom PENDINGORDERSwhere Part = new.Part;if X = 0 then

insert into PENDINGORDERSvalues(new.Part,new.QtyReord,sysdate)

end if;end;

Page 6: Le Basi di Dati Attive - CNR 1112/Slides/08... · 2015. 6. 19. · Basi di Dati 2 – Prof. Antonio d’Acierno I DB Attivi 5 Triggers I triggers sono delle stored procedures che

6

Basi di Dati 2 – Prof. Antonio d’Acierno I DB Attivi 11

Trigger: esempio

� Viene eseguita T1:– update WAREHOUSE

set QtyAvbl = QtyAvbl – 70where Part = 1

� La esecuzione di T1 causa un’esecuzione del trigger “Reorder”

– porta nella tabella PENDINGORDERS la tupla (1,100,<oggi>);

Basi di Dati 2 – Prof. Antonio d’Acierno I DB Attivi 12

Trigger: esempio

� Viene eseguita T2: – update WAREHOUSE

set QtyAvbl = QtyAvbl – 60where Part <= 3

� La successiva esecuzione di T2 causa l’esecuzione del trigger “Reorder” per tre volte con soddisfacimento della condizione di scatto per le parti 1 e 3.

� L’azione relativa alla parte 1 non ha effetto select count(*) into X from PENDINGORDERSwhere Part = new.Part;

valuta X=1 – poiché è già presente la parte considerata;

� L’azione relativa alla parte 2 non ha effetto� L’azione relativa alla parte 3 porta nella tabella PENDINGORDERS

la nuova tupla (3,120,<oggi>)

Page 7: Le Basi di Dati Attive - CNR 1112/Slides/08... · 2015. 6. 19. · Basi di Dati 2 – Prof. Antonio d’Acierno I DB Attivi 5 Triggers I triggers sono delle stored procedures che

7

Basi di Dati 2 – Prof. Antonio d’Acierno I DB Attivi 13

Sintassi SQL:2003 dei trigger

� Lo standard propone una sintassi simile a quella offerta da IBM DB2; ogni trigger è caratterizzato da:

– Nome del trigger

– nome della tabella che viene monitorata

– modo di esecuzione (BEFORE o AFTER)

– l’evento monitorato (INSERT, DELETE o UPDATE)

– granularità (statement-level o row-level)– nomi e alias per “transition tables” e “transition rows”

– eventuale condizione

– l’azione

– il timestamp di creazione

Basi di Dati 2 – Prof. Antonio d’Acierno I DB Attivi 14

Sintassi SQL:2003 dei trigger

� create trigger NomeTrigger{before | after}{ insert | delete | update [of Colonne] } on Tabella[referencing

{[old table [as] AliasTabellaOld] [new table [as] AliasTabellaNew] } |

{[old [row] [as] NomeTuplaOld][new [row] [as] NomeTuplaNew] }]

[for each { row | statement }][when Condizione]ComandiSQL

Page 8: Le Basi di Dati Attive - CNR 1112/Slides/08... · 2015. 6. 19. · Basi di Dati 2 – Prof. Antonio d’Acierno I DB Attivi 5 Triggers I triggers sono delle stored procedures che

8

Basi di Dati 2 – Prof. Antonio d’Acierno I DB Attivi 15

Esecuzione: conflitti tra trigger

� Se vi sono più trigger associati allo stesso evento, SQL:2003 prescrive questa politica di gestione:– Vengono eseguiti i trigger BEFORE statement-level– Vengono eseguiti i trigger BEFORE row-level– Si applica la modifica e si verificano i vincoli di

integrità definiti sulla base di dati– Vengono eseguiti i trigger AFTER row-level– Vengono eseguiti i trigger AFTER statement-level

� Se vi sono più trigger della stessa categoria:– l’ordine di esecuzione viene scelto dal sistema in un

modo che dipende dall’implementazione.

Basi di Dati 2 – Prof. Antonio d’Acierno I DB Attivi 16

Impiego dei trigger

� Per la descrizione di regole esterne (o regole aziendali)– Esprimono conoscenza di tipo applicativo

� Per la descrizione di regole interne alla base di dati– Trigger generati dal sistema e non visibili all’utente

(gestione della integrità referenziale).

Page 9: Le Basi di Dati Attive - CNR 1112/Slides/08... · 2015. 6. 19. · Basi di Dati 2 – Prof. Antonio d’Acierno I DB Attivi 5 Triggers I triggers sono delle stored procedures che

9

Basi di Dati 2 – Prof. Antonio d’Acierno I DB Attivi 17

Integrità referenziale: esempio

� Si consideri il seguente schema di base dati:IMPIEGATI (Matricola, Nome, Salario, Dipartimento) DIPARTIMENTI(Numero, Direttore)

� CREATE TRIGGER ControllaDipImpiegatoBEFORE INSERT ON IMPIEGATI FOR EACH ROW WHEN (not exists select * from DIPARTIMENTI

where Numero = NEW.Dipartimento)BEGIN raise_application_error(-20000, ‘Dipartimento non valido‘); END;

Basi di Dati 2 – Prof. Antonio d’Acierno I DB Attivi 18

Vincoli Integrità

� CREATE TRIGGER ControllaModificaDipartimentoAFTER UPDATE OF Numero ON DIPARTIMENTIFOR EACH ROWWHEN (exists select * from IMPIEGATI

where Dipartimento = OLD.Numero)BEGINupdate IMPIEGATI set Diaprtimento = NEW.Numerowhere Dipartimento = OLD.Numero;END;

Page 10: Le Basi di Dati Attive - CNR 1112/Slides/08... · 2015. 6. 19. · Basi di Dati 2 – Prof. Antonio d’Acierno I DB Attivi 5 Triggers I triggers sono delle stored procedures che

10

Basi di Dati 2 – Prof. Antonio d’Acierno I DB Attivi 19

Vicoli di Integrità

� CREATE TRIGGER ControllaCancDipartimentoAFTER DELETE ON DIPARTIMENTIFOR EACH ROWWHEN (exists select * from IMPIEGATI

where Dipartimento = OLD.Numero)BEGINUPDATE IMPIEGATISET Dipartimento=NULLWHERE Dipartimento = OLD.Numero;END;

Basi di Dati 2 – Prof. Antonio d’Acierno I DB Attivi 20

Triggers in PostgreSQL 9.0

� On tables – triggers can be defined to execute either before or

after any INSERT, UPDATE, or DELETE operation, either once per modified row, or once per SQL statement.

– UPDATE triggers can moreover be set to fire only if certain columns are mentioned in the SET clause of the UPDATE statement.

Page 11: Le Basi di Dati Attive - CNR 1112/Slides/08... · 2015. 6. 19. · Basi di Dati 2 – Prof. Antonio d’Acierno I DB Attivi 5 Triggers I triggers sono delle stored procedures che

11

Basi di Dati 2 – Prof. Antonio d’Acierno I DB Attivi 21

Esempio 1: Creare il DB

Basi di Dati 2 – Prof. Antonio d’Acierno I DB Attivi 22

Esempio 1: Creare il Trigger

Page 12: Le Basi di Dati Attive - CNR 1112/Slides/08... · 2015. 6. 19. · Basi di Dati 2 – Prof. Antonio d’Acierno I DB Attivi 5 Triggers I triggers sono delle stored procedures che

12

Basi di Dati 2 – Prof. Antonio d’Acierno I DB Attivi 23

Esempio 1: Effetto

Basi di Dati 2 – Prof. Antonio d’Acierno I DB Attivi 24

Esempio 2: Creare il DB

Page 13: Le Basi di Dati Attive - CNR 1112/Slides/08... · 2015. 6. 19. · Basi di Dati 2 – Prof. Antonio d’Acierno I DB Attivi 5 Triggers I triggers sono delle stored procedures che

13

Basi di Dati 2 – Prof. Antonio d’Acierno I DB Attivi 25

Esempio 2: Creare i Trigger

Basi di Dati 2 – Prof. Antonio d’Acierno I DB Attivi 26

Esempio 2: Creare i Trigger

Page 14: Le Basi di Dati Attive - CNR 1112/Slides/08... · 2015. 6. 19. · Basi di Dati 2 – Prof. Antonio d’Acierno I DB Attivi 5 Triggers I triggers sono delle stored procedures che

14

Basi di Dati 2 – Prof. Antonio d’Acierno I DB Attivi 27

Esempio 2: Creare i Trigger

Basi di Dati 2 – Prof. Antonio d’Acierno I DB Attivi 28

Esempio 2: Effetto

Page 15: Le Basi di Dati Attive - CNR 1112/Slides/08... · 2015. 6. 19. · Basi di Dati 2 – Prof. Antonio d’Acierno I DB Attivi 5 Triggers I triggers sono delle stored procedures che

15

Basi di Dati 2 – Prof. Antonio d’Acierno I DB Attivi 29

Triggers in PostgreSQL 9.1

� On views– triggers can be defined to execute

� instead of INSERT, UPDATE, or DELETE operations.

– It is the responsibility of the trigger's function to perform the necessary modifications to the underlying base tables and, where appropriate, return the modified row as it will appear in the view.

– INSTEAD OF triggers are fired once for each row that needs to be modified in the view.

– Triggers on views can also be defined to execute once per SQL statement, before or after INSERT, UPDATE, or DELETE operations.

Basi di Dati 2 – Prof. Antonio d’Acierno I DB Attivi 30

Esempio 3: Creare il DB

Page 16: Le Basi di Dati Attive - CNR 1112/Slides/08... · 2015. 6. 19. · Basi di Dati 2 – Prof. Antonio d’Acierno I DB Attivi 5 Triggers I triggers sono delle stored procedures che

16

Basi di Dati 2 – Prof. Antonio d’Acierno I DB Attivi 31

Esempio 3:

� Sulla vista ovviamente ….

Basi di Dati 2 – Prof. Antonio d’Acierno I DB Attivi 32

Esempio 3: Col Trigger nella 9.0

Page 17: Le Basi di Dati Attive - CNR 1112/Slides/08... · 2015. 6. 19. · Basi di Dati 2 – Prof. Antonio d’Acierno I DB Attivi 5 Triggers I triggers sono delle stored procedures che

17

Basi di Dati 2 – Prof. Antonio d’Acierno I DB Attivi 33

Esempio 3: RULE nella 9.0