Triggers. Antonella Poggi, Claudio Corona. Dipartimento di informatica e Sistemistica Università di Roma La Sapienza

Documenti analoghi
Triggers. Basi dati attive. Trigger. Indipendenza della conoscenza

Introduzione. i trigger rendono reattivo il comportamento del sistema alle sollecitazioni esterne.

Trigger. Basi di dati attive. Trigger: regole che specificano azioni attivate automaticamente dal DBMS al verificarsi di determinati eventi

Basi di Dati: Corso di laboratorio

Basi di dati attive. Paolo Atzeni Stefano Ceri. Basi di dati attive

Le Basi di Dati Attive

Silvia Chiusano, Paolo Garza 1

Progettazione di Sistemi Informatici

Il linguaggio SQL: trigger

Corso di Basi di Dati

Stored Procedure. Antonella Poggi. Dipartimento di informatica e Sistemistica Sapienza Università di Roma

Tecnologia delle Basi di Dati Esercitazione #4 Definizione dei trigger in Oracle

Basi di dati attive 1

Basi di Dati CREAZIONE E POPOLAMENTO DI UNA BASE DI DATI

Basi di dati attive. Una base di dati è ATTIVA quando consente la definizione e la gestione di regole di produzione (regole attive o trigger).

Transazioni. Antonella Poggi. Dipartimento di informatica e Sistemistica Università di Roma La Sapienza

Operazioni scatenanti. Nozione ed uso. Sintassi. Esempio

SQL: DDL, VI, Aggiornamenti e Viste

Vincoli di Integrità

Triggers Esercitazione 1

Elena Baralis 2007 Politecnico di Torino 1

Il linguaggio SQL: trigger. Versione elettronica: 04.7.SQL.trigger.pdf

Capitolo 5. Soluzione: Soluzione in C:

Lezione 8. Metadati, Viste e Trigger

Il linguaggio SQL: autorizzazioni

2011 Politecnico di Torino 1

MySQL Procedure, funzioni, trigger e scheduling

Stored Procedures. Antonella Poggi, Claudio Corona. Dipartimento di informatica e Sistemistica SAPIENZA Università di Roma

Basi di dati (3) Docente: Andrea Bulgarelli. Università di Modena e Reggio Emilia. Argomento: DML (1.

OBIETTIVI DELL'ESERCITAZIONE

Caratteristiche dei linguaggi per Database

PROVA SCRITTA DI TECNOLOGIA DATABASE 02/12/2004 Corso di Laurea Specialistica in Ingegneria Informatica - NOD PROF.

DATABASE PER IL WEB. Programmazione Web 1

Laboratorio di Basi di Dati SQL avanzato

LABORATORIO di INFORMATICA

Viene richiesto di MIN CARD(S,E) = 1 UPDATE DELETE MAX CARD(S,E) = 3 INSERT UPDATE

SQL - Structured Query Language

MY SQL Guida MySQL di base

SQL non è solo un linguaggio di interrogazione (Query Language), ma. Un linguaggio per la definizione di basi di dati (Data-definition language (DDL))

SQL PER LA DEFINIZIONE DI BASI DI DATI

Laboratorio di PL/SQL 3 Esercizi svolti e valutati

SQL: Definizione e Manipolazione di Relazioni. Capitolo 2

Fondamenti di Teoria delle Basi di Dati

DBMS. Affidabilità. Privatezza dei dati. Efficienza. Efficacia. Un DBMS deve garantire:

Structured. Language. Basi di Dati. Introduzione. DDL: Data Definition Language. Tipi di dato. Query. Modifica dei Dati

JDBC. Marco Tessarotto Programmazione dei Web Server Anno Accademico

Il linguaggio SQL. Il linguaggio SQL. Il linguaggio SQL. Il linguaggio SQL. Il linguaggio SQL: fondamenti. Il linguaggio SQL

Pag Politecnico di Torino 1

PROVA SCRITTA DI TECNOLOGIA DATABASE 05/12/2003 Corso di Laurea Specialistica in Ingegneria Informatica - NOD PROF.

Esercitazione: Interrogazioni SQL

Esercitazione 4: Trigger in DB2

Cap. 5 Basi di dati attive

V. Moriggia Modelli di Base Dati. Modelli di Base Dati. a.a. 2001/

Domande utili alla preparazione dell orale di Informatica all Esame di Stato

PL/SQL PL/SQL. Ordine degli elementi dei triggers di Oracle. Differenze nei triggers. Versione dei trigger e PSM di Oracle

Alessandra Raffaetà. Esercizio: Cinema

Vincoli e Triggers. Vincoli. Tipo di vincoli. Chiavi esterne

Basi di Dati: Corso di laboratorio

TRIGGER Regole Attive (Trigger) OLD_TABLE NEW_TABLE old new

Basi di Dati. S Q L Lezione 5

Stored Procedures. Massimo Mecella Dipartimento di Ingegneria informatica automatica e gestionale Antonio Ruberti Sapienza Università di Roma

SQL quick reference. piccolo manuale di riferimento dei principali comandi SQL (prof. Claudio Maccherani, Perugia, 2013)

Parte I - Concetti Base ESEMPIO

SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative

Per poter interagire con un database in rete mediante uno script php bisogna. innanzitutto cerare una connessione. Ciò si ottiene mediante la funzione

Corso di Basi di Dati A.A. 2015/2016

Servlet & JDBC ALBERTO BELUSSI ANNO ACCADEMICO 2009/2010. Servlet: interazione con un DBMS. In Java è possibile interagire con un DBMS attraverso

VARIABILI, ASSEGNAZIONE, DECISIONI

Esempio di database relazionale con l utilizzo del prodotto MySQL

Tecnologia delle Basi di Dati

Programmazione Orientata agli Oggetti. Emilio Di Giacomo e Walter Didimo

Interrogazioni nidificate

SQL. Laboratorio di Progettazione di Basi di Dati (CdS in Informatica e TPS)

SQL. SQL: "storia. Sviluppato nella metà degli anni settanta (1974) presso il laboratorio di ricerca IBM di S.Josè. Dal 1983 ca. "standard di fatto"

Gestione della Concorrenza

MySQL. Basi di Dati e Sistemi Informativi Prof. Marco Di Felice Dott.sa Sara Zuppiroli A.A

Programmazione Procedurale in Linguaggio C++

ESERCIZI SQL. Esercizio 1

Interrogare una base di dati: algebra relazionale e SQL. Savino Castagnozzi Giorgio Macauda Michele Meomartino Salvatore Picerno Massimiliano Sartor

Spiegazioni esercizio Gestione Tabella con PHP e MySQL

Microsoft Access. Microsoft Access. Maurizio Rebaudengo, Paolo Garza 1. Microsoft Access. Creazione base di dati. Apertura di una base dati

Manuale d uso della Posta TBS. Oracle Collaboration Suite

SQL nei linguaggi di programmazione

Nozione ed uso. Operazioni eseguite automaticamente ogni volta che avviene un certo evento Uso:

Il linguaggio SQL: le viste

DBMS. Alice Pavarani

Oggetto: Utility per la variazione massiva del codice IVA.

Interrogazioni nidificate

Capitolo 7. Esercizio 7.1

Procedure memorizzate SQL-2003/PSM. Forma base di PSM. Parametri in PSM

DUE GRUPPI DI COMANDI

SQL: Structured Query Language. T. Catarci, M. Scannapieco, Corso di Basi di Dati, A.A. 2008/2009, Sapienza Università di Roma

Dichiarazione degli schemi in SQL DDL 1

JavaScript Core Language. Prof. Francesco Accarino IIS Atiero Spinelli Sesto San Giovanni via leopardi 132

Basi di Dati Parallele

7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari

Query. Query (Interrogazioni) SQL SQL. Significato dell interrogazione. Sintassi

Componenti di un DBMS

ARCHITETTURA DI UN DBMS

Appunti di MySql. Evoluzione di un tutorial di base di mysql, scritto da Etel Sverdlov.

Transcript:

Triggers Antonella Poggi, Claudio Corona Dipartimento di informatica e Sistemistica Università di Roma La Sapienza Progetto di Applicazioni Software Anno accademico 2008-2009 Questi lucidi sono stati prodotti sulla base del materiale preparato per il corso di Progetto di Basi di Dati da D. Lembo.

Basi dati attive Una base di dati si dice attiva quando possiede un sottosistema integrato in grado di gestire regole di produzione Le regole di produzione seguono il paradigma Evento-Condizione-Azione (ECA): ciascuna regola reagisce ad alcuni eventi, valuta una condizione, ed, in base al valore di verità della condizione, esegue una reazione Il sottosistema controlla l esecuzione delle regole Il sistema risultante ha un comportamento reattivo (che si differenzia dal tipico comportamento passivo delle basi di dati) A. Poggi C. Corona 1

Indipendenza della conoscenza La conoscenza relativa al comportamento reattivo viene sottratta ai programmi applicativi e codificata sotto forma di regole di produzione Tale conoscenza è definita una volta per tutte in modo da essere condivisa da tutte le applicazioni che utilizzano la base di dati stessa In tal modo si evita di replicare la definizione del comportamento reattivo in ciascuna applicazione A. Poggi C. Corona 2

Trigger Le regole di produzione messe tipicamente a disposizione dai DBMS sono dette trigger (o regole attive) I trigger fanno parte dello standard SQL La creazione dei trigger fa parte del Data Definition Language I trigger creati possono essere cancellati, ed in genere possono essere attivati e disattivati dinamicamente A. Poggi C. Corona 3

Trigger (cont.) Nel paradigma Evento-Condizione-Azione adottato dai trigger: Gli eventi sono primitive per la manipolazione dei dati: INSERT, DELETE, UPDATE La condizione (che può mancare) è un predicato booleano L azione è una procedura eseguita quando il trigger è attivato e la condizione è verificata A. Poggi C. Corona 4

Trigger (cont.) I trigger fanno riferimento ad una tabella, in quanto rispondono ad eventi su questa tabella I trigger hanno due livelli di granularità: di tupla (row-level): l attivazione avviene per ogni tupla coinvolta nella operazione (in genere si specifica l opzione FOR EACH ROW nella definizione del trigger) di istruzione (statement-level): l attivazione avviene una sola volta a seguito dell evento facendo riferimento a tutte le tuple coinvolte nell operazione A. Poggi C. Corona 5

Trigger (cont.) L azione del trigger può essere effettuata prima (opzione BEFORE) che i cambiamenti previsti dall evento siano eseguiti sulla tabella associata, oppure dopo (opzione AFTER) L esecuzione del trigger avviene all interno della transazione che ha causato l evento innescante In SQL è prevista la possibilità di valutare il trigger alla fine della transazione a seguito dell esecuzione di un commit work (modalità differita) N.B. Ad oggi, la maggior parte dei DBMS (tra cui Oracle o MySQL) non supportano la modalità differita. A. Poggi C. Corona 6

Trigger in MySQL / 1 In MySQL, un trigger può essere associato ad una stored procedure precedentemente definita, oppure può definire esso stesso l azione da intraprendere (codificata in SQL) a seguito dell evento innescante Nel codice SQL della stored procedure associata al trigger oppure nel codice definito dal trigger stesso si verifica la condizione e si definisce l azione da eseguire A. Poggi C. Corona 7

Trigger in MySQL / 2 È possibile specificare esclusivamente row-level trigger: il codice associato al trigger è eseguito una volta per ogni tupla interessata dal cambiamento (cioè modificata dall evento); Si utilizzano gli identificatori OLD e NEW (da passare eventualmente come parametri alla stored procedure associata al trigger), che indicano rispettivamente la tupla corrente prima e dopo l evento (inserimento, cancellazione, o aggiornamento) che ha innescato il trigger, e consentono di accedere ai suoi campi. A. Poggi C. Corona 8

Trigger in MySQL / 3 Si noti tuttavia che: I trigger di tipo INSERT possono accedere solo ai valori nuovi I trigger di tipo DELETE possono accedere solo ai valori vecchi I trigger di tipo UPDATE possono accedere sia ai valori vecchi che a quelli nuovi A. Poggi C. Corona 9

Sintassi dei Trigger / 1 CREATE TRIGGER trigger_name [DEFINER = { user CURRENT_USER }] {BEFORE AFTER} {INSERT DELETE UPDATE} ON tbl_name FOR EACH ROW trigger_stmt trigger_name è il nome del trigger (eventualmente preceduto da database_name.). tbl_name è il nome della tabella su cui si deve verificare l evento per innescare il trigger. A. Poggi C. Corona 10

Sintassi dei Trigger / 2 trigger_stmt è il comando eseguito all attivazione del trigger per eseguire più di un comando si usa il costrutto BEGIN...END è possibile usare gli stessi comandi ammessi nelle stored procedure se si vuole chiamare una stored procedure, si usa l istruzione CALL A. Poggi C. Corona 11

Sintassi dei Trigger / 3 BEFORE indica che il trigger_stmt deve essere eseguito prima che l evento che lo ha innescato sia completato (l inserimento, la cancellazione o la modifica vengono di fatto messi in attesa che sia eseguita l azione del trigger), AFTER indica che il trigger_stmt deve essere eseguito dopo l evento. Solo uno fra INSERT DELETE UPDATE può essere utilizzato, ed indica l evento che innesca il trigger. A. Poggi C. Corona 12

Sintassi dei Trigger / 4 È possibile usare l opzione [DEFINER = { user CURRENT_USER }] all interno dello statement di creazione di un trigger per specificare con quali privilegi si intende che l azione sia eseguita di default sono quelli dell utente che crea il trigger (ovvero sono quelli del CURRENT USER), altrimenti sono quelli dell utente user manuale MySQL). A. Poggi C. Corona 13

Cancellare Trigger Per eliminare un trigger si usa il comando DROP TRIGGER trigger_name; Si noti che, nel caso in cui il trigger sia associato ad una stored procedure, cancellare il trigger non significa cancellare la stored procedure associata A. Poggi C. Corona 14

Esempio CREATE TABLE test1(a1 INT); CREATE TABLE test2(a2 INT); CREATE TABLE test3(a3 INT); CREATE TABLE test4( a4 INT, b4 INT ); A. Poggi C. Corona 15

DELIMITER CREATE TRIGGER testref BEFORE INSERT ON test1 FOR EACH ROW BEGIN INSERT INTO test2 VALUES(NEW.a1); DELETE FROM test3 WHERE a3=new.a1; UPDATE test4 SET b4=b4+1 WHERE a4=new.a1; END A. Poggi C. Corona 16

DELIMITER ; INSERT INTO test3 (a3) VALUES (1); INSERT INTO test4 (a4,b4) VALUES (1,0); INSERT INTO test1 VALUES (1); A. Poggi C. Corona 17

Esempio mysql> SELECT * FROM test1; +------+ a1 +------+ 1 +------+ mysql> SELECT * FROM test2; +------+ a2 +------+ 1 +------+ A. Poggi C. Corona 18

mysql> SELECT * FROM test3; Empty set (0.00 sec) mysql> SELECT * FROM test4; +------+------+ a4 b4 +------+------+ 1 1 +------+------+ A. Poggi C. Corona 19

Nota Un trigger si esegue solo sulle tuple modificate dall evento innescante: se non ce ne sono, non viene eseguito. Esempio: Sia data la seguente tabella chiamata tab eta +------+-------+ id eta +------+-------+ A1 20 +------+-------+ Assumiamo di avere un trigger per una DELETE su tab eta Si esegua il comando DELETE FROM tab_eta WHERE id= A3 ; Poichè non ci sono righe cancellate, il trigger non scatta. A. Poggi C. Corona 20

Esempio Assumiamo ora di avere le seguenti tabelle CREATE TABLE prodotto( nome VARCHAR(25), prezzo FLOAT); CREATE TABLE vendite( prodotto VARCHAR(25), data DATE); CREATE TABLE incasso_giornaliero( data DATE, totale FLOAT); A. Poggi C. Corona 21

Esempio (cont.) Si consideri il seguente problema: Per ogni articolo venduto in una data d si aggiorni automaticamente l incasso totale relativo alla data d Nel nostro schema questo vuole dire che: All inserimento di una tupla <p,d> all interno della tabella vendite, si aggiorna automaticamente la tabella incasso giornaliero in modo che 1. se non esiste una tupla in incasso giornaliero del tipo <d,t>, vi si inserisce <d,p> dove p è il prezzo dell articolo venduto 2. altrimenti si aggiorna la tupla <d,t> nella tupla <d,t >, con t =t+p A. Poggi C. Corona 22

Esempio (cont.) CREATE PROCEDURE incrementa (n VARCHAR(25), d DATE) BEGIN DECLARE pr FLOAT; DECLARE dd DATE; DECLARE present BOOL DEFAULT 1; DECLARE verifica_presenza CURSOR FOR SELECT data FROM incasso_giornaliero WHERE data=d; DECLARE CONTINUE HANDLER FOR SQLSTATE 02000 SET present=0; SELECT prezzo INTO pr FROM prodotto WHERE nome=n; OPEN verifica_presenza; FETCH verifica_presenza INTO dd; IF NOT present THEN INSERT INTO incasso_giornaliero VALUES (d,pr); ELSE UPDATE incasso_giornaliero SET totale=totale+pr WHERE data=d; END IF; END A. Poggi C. Corona 23

Esempio (cont.) CREATE TRIGGER incrementa_tgr AFTER INSERT ON vendite FOR EACH ROW CALL incrementa(new.prodotto,new.data); Nota: Ricordarsi di cambiare il delimitatore dei comandi quando si definisce la stored procedure. A. Poggi C. Corona 24

Esempio Assumiamo ora di avere la seguente relazione CREATE TABLE impiegato( codice VARCHAR(25), nome VARCHAR(25), salario INT ); e la seguente stored procedure MySQL CREATE PROCEDURE allinea_salario (livello INT) UPDATE IMPIEGATO SET SALARIO=livello WHERE SALARIO<livello; A. Poggi C. Corona 25

Esempio Creiamo un trigger che esegue la stored procedure CREATE TRIGGER trig_salario AFTER UPDATE ON impiegato FOR EACH ROW CALL allinea_salario(100); A. Poggi C. Corona 26

Esempio Creiamo un trigger che esegue la stored procedure CREATE TRIGGER trig_salario AFTER UPDATE ON impiegato FOR EACH ROW CALL allinea_salario(100); Anche se il trigger è corretto, se tentiamo di aggiornare la tabella impiegato otteniamo il messaggio di errore: Can t update table impiegato in stored function/trigger because it is already used by statement which invoked this stored function/trigger. Limite di MySQL: Nel trigger non è possibile modificare la tabella interessata dall evento che innesca il trigger A. Poggi C. Corona 27

Altri limiti nell utilizzo dei trigger in MySQL Non è possibile definire due trigger sulla stessa tabella, per la stessa coppia (evento, momento); Le cancellazioni in cascata (ottenute tramite il comando CASCADE associato ad un foreign key) non innescano eventuali trigger associati a tali cancellazioni; Un trigger non può innescare istruzioni di tipo RETURN Non è possibile inviare esplicitamente un messaggio di errore dal corpo di un trigger (o da una stored procedure) in modo da bloccare l esecuzione dell evento che ha innescato il trigger (o della transazione che ha invocato la stored procedure); in altre parole, non si può simulare un corportamento come quello che si ottiene in JAVA tramite l uso delle eccezioni. A. Poggi C. Corona 28

Cicli nei trigger Un trigger può attivarne un altro; in tal caso i trigger si dicono in cascata. Le reciproche attivazioni dei trigger si rappresentano col grafo di attivazione. Quando c è un ciclo nel grafo di attivazione può esserci una serie infinita di esecuzioni di trigger. In genere, i DBMS presentano un limite massimo consentito di attivazioni consecutive dello stesso trigger (per evitare cicli infiniti). Tuttavia, spesso i cicli nel grafo di attivazione sono innocui. Occorre comunque fare attenzione ai cicli quando si realizzano trigger. A. Poggi C. Corona 29