Triggers Esercitazione 1

Похожие документы
Basi di Dati: Corso di laboratorio

Silvia Chiusano, Paolo Garza 1

Operazioni scatenanti. Nozione ed uso. Sintassi. Esempio

Lezione 8. Metadati, Viste e Trigger

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

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

SQL: DDL, VI, Aggiornamenti e Viste

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

Suggerimenti per lo Sviluppo delle Applicazioni con PL/SQL. Simona Rotolo

Elena Baralis 2007 Politecnico di Torino 1

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

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

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

Nella relazione CINEMA, Nome è chiave secondaria. Nella relazione FILM, CodRegista, e CodProtagonista sono chiavi esterne sulla tabella PERSONE.

Soluzione DDL ed Algebra Relazionale

Il linguaggio SQL: trigger

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

DUE GRUPPI DI COMANDI

Triggers. Basi dati attive. Trigger. Indipendenza della conoscenza

LABORATORIO di INFORMATICA

Il linguaggio SQL: autorizzazioni

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

DATABASE PER IL WEB. Programmazione Web 1

Il DBMS Oracle. Express Edition. Donatella Gubiani e Angelo Montanari

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

Basi di dati. Il Linguaggio SQL. K. Donno - Il Linguaggio SQL

Basi di Dati: Corso di laboratorio

Basi di Dati. S Q L Lezione 5

2011 Politecnico di Torino 1

Il sistema informativo deve essere di tipo centralizzato e accessibile mediante un computer server installato nella rete locale dell albergo.

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

Oracle PL/SQL. Motivazioni

SQL: Definizione e Manipolazione di Relazioni. Capitolo 2

VARIABILI, ASSEGNAZIONE, DECISIONI

SQL Server. SQL server e un RDBMS di tipo client/server che utilizza Transact-SQL per gestire la comunicazione fra un client e SQL Server

OBIETTIVI DELL'ESERCITAZIONE

Costruzione di Sit Web con PHP e MySQL. Lezione 7 - Esercitazione - Introduzione a MySQL: le tabelle, i tpi di dato, le query

TRIGGER Regole Attive (Trigger) OLD_TABLE NEW_TABLE old new

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

DBMS (Data Base Management System)

DDL, VINCOLI D INTEGRITÁ, AGGIORNAMENTI E VISTE. SQL è più di un semplice linguaggio di interrogazione

Spiegazioni esercizio Gestione Tabella con PHP e MySQL

Laboratorio di Basi di Dati

Vincoli di Integrità

Cap. 5 Basi di dati attive

Interrogazioni nidificate

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

Capitolo 6 - Array. Copyright by Deitel & Associates, Inc. and Pearson Education Inc. All Rights Reserved.

Lavorare con MySQL Parte Prima.

Oracle - PL/SQL. Oracle: Prodotti

SQL -DDL. FONDISTA(Nome, Nazione, Età) GAREGGIA(NomeFondista, NomeGara, Piazzamento) GARA(Nome, Luogo, Nazione, Lunghezza)

Esercitazione 4: Trigger in DB2

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

Laboratorio Progettazione Web PHP e MySQL. Andrea Marchetti IIT-CNR 2013/2014

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

Lavorare con MySQL Parte Seconda.

Interrogazioni nidificate

Insegnamento di Informatica CdS Scienze Giuridiche A.A. 2006/7. Il trattamento dei dati

Capitolo 5. Soluzione: Soluzione in C:

Le query di comando e di servizio in Access

Esame Informatica Generale 13/04/2016 Tema A

Basi di Dati prof. Letizia Tanca lucidi ispirati al libro Atzeni-Ceri-Paraboschi-Torlone. SQL: il DDL

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

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

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

Caratteristiche dei linguaggi per Database

RDBMS: panorama attuale. RDBMS: panorama attuale

ESERCIZI SQL. Esercizio 1

Percorso Formativo SAP Online ABAP/4 Completo

MY SQL Guida MySQL di base

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

Esercizio 2: Algebra dei Puntatori e Puntatori a Puntatori

MySQL Procedure, funzioni, trigger e scheduling

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

Il quarto tipo di blocco PL/SQL con nome è il trigger.

The world s most advanced class on PostgreSQL o quasi! 4 Marzo 8 Aprile L'Antipasto 11 Marzo

PHP 5. PHP ed i database. Database e tabelle. Struttura di un DB relazionale. Accesso a database

SQL Esercitazione (database e tabelle) Ing. Cosimo Orlacchio

LA REALIZZAZIONE DI APPLICAZIONI ALCUNE ARCHITETTURE

Corso sul PACCHETTO OFFICE. Modulo Access

LA REALIZZAZIONE DI APPLICAZIONI. Quattro parti: Gestione dati. Business rules. Logica applicativa. Interfaccia utente. Molte possibili architetture

Basi di dati (8) Docente: Andrea Bulgarelli. Università di Modena e Reggio Emilia. andrea.bulgarelli@gmail.com Argomento: trigger e cursori (1.

DBMS open source: Postgres

PROGRAMMA CORSO Analista Programmatore JAVA - ORACLE

SQL Avanzato. Interrogazioni e il valore NULL. Interrogazioni complesse, trigger, viste e modifiche dello schema. Giorgio Giacinto 2015

Транскрипт:

Triggers Esercitazione 1 Nel seguente documento vengono mostrati alcuni esempi di trigger e di funzioni pgplsql. Si ricorda che i trigger vengono eseguiti al verificarsi di certe condizioni definite dal progettista del database e che ogni volta che un trigger va in esecuzione viene invocata una particolare funzione definita in un linguaggio plsql. In particolare, noi ci concentreremo sulle funzioni scritte nel linguaggio pgplsql. Archiviazione Barche Il primo esempio che vedremo e' quello di un trigger che va in esecuzione ogni volta che viene cancellata una tupla dalla tabella barche e aggiunge la tupla eliminata alla tabella ex_barche. Innanzitutto e' necessario creare la tabella ex_barche con lo stesso schema della relazione della tabella barche. Prima di tutto definiamo la funzione che il trigger richiamerà durante la sua esecuzione. CREATE OR REPLACE FUNCTION archivia_barca() RETURNS trigger AS $archivia_barca$ -- Aggiorna la tabella delle barche non più in uso INSERT INTO ex_barche SELECT OLD.bid, OLD.bnome, OLD.colore; END $archivia_barca$ LANGUAGE plpgsql; Una volta creata la funzione possiamo definire il trigger come riportato di seguito. CREATE TRIGGER archivia_barca AFTER INSERT OR UPDATE OR DELETE ON barche FOR EACH ROW EXECUTE PROCEDURE archivia_barca(); Esercizio: Creare una tabella ex_velisti, con lo stesso schema della relazione della tabella velisti e definire una funzione e un trigger che inseriscono nella tabella ex_velisti ogni tupla che viene cancellata dalla tabella velisti. Calcolo Statistiche di Accesso al Database Questo esempio mostra come mantenere delle statistiche di accesso al database ogni volta che viene effettuata un comando di update, di insert o di delete su una qualsiasi tabella del database. Prima di tutto e' necessario creare una tabella che conterrà le statistiche di accesso al database. Lo schema della relazione statistiche e' riportato di seguito. Column tipo_accesso nome_utente tempo Type character(1) character varying(20) timestamp with time zone -1-

Una volta creato lo schema della relazione statistiche si può procedere alla definizione della funzione che verra' invocata ogni volta che un trigger andrà in esecuzione. La funzione per l'aggiornamento delle statistiche e' riportata di seguito. CREATE OR REPLACE FUNCTION statistiche_vela() RETURNS TRIGGER AS $statistiche_vela$ -- Crea una riga nella tabella che riflette le modifiche fatte -- nel database IF (TG_OP = 'DELETE') THEN INSERT INTO statistiche SELECT 'D', user, now(); ELSIF (TG_OP = 'UPDATE') THEN INSERT INTO statistiche SELECT 'U', user, now(); RETURN NEW; ELSIF (TG_OP = 'INSERT') THEN INSERT INTO statistiche SELECT 'I', user, now(); RETURN NEW; RETURN NULL; -- Ignora il risultato perchè siamo dopo del trigger $statistiche_vela$ LANGUAGE plpgsql; La variabile TG_OP presente nello script e' una variabile che viene settata automaticamente dal trigger che invoca questa funzione e contiene al suo interno l'operazione che ha scatenato il trigger stesso. In questo modo possiamo scrivere una sola funzione per gestire sia gli eventi dovuti ad un comando di update, ad un comando di insert e ad un comando di delete. La variabile user contiene invece il nome utente di chi ha eseguito il comando che ha poi scatenato il trigger. La funzione now() ritorna il tempo corrente nel formato timestamp. Una volta definita la funzione di aggiornamento delle statistiche e' necessario definire un trigger che richiama questa funzione per ciascuna tabella di cui vogliamo monitorare le statistiche. Di seguito sono riportate le definizioni dei trigger per tutte le tabelle. AFTER INSERT OR UPDATE OR DELETE ON prenotazioni AFTER INSERT OR UPDATE OR DELETE ON barche AFTER INSERT OR UPDATE OR DELETE ON velisti AFTER INSERT OR UPDATE OR DELETE ON ex_barche AFTER INSERT OR UPDATE OR DELETE ON ex_velisti -2-

E' interessante notare che se sia i triggers di aggiornamento delle statistiche che quelli di archiviazione delle tabelle velisti e barche sono definiti nel database, si può osservare il fenomeno dei triggers richiamati a cascata. Ad esempio, quando viene cancellata una tupla dalla tabella barche, vengono invocati sia il trigger di aggiornamento delle statistiche, sia il trigger per l'archiviazione del valore cancellato nella tabella ex_barche. L'inserimento nella tabella ex_barche della tupla cancellata da barche, scatena a sua volta un nuovo trigger di aggiornamento statistiche per la tabella ex_barche. Nota: secondo la definizione del linguaggio pgplsql se due trigger vengono invocati contemporaneamente, essi vengono eseguiti secondo l'ordine alfabetico dei loro nomi. La variabile TG_OP presente nello script e' una variabile che viene settata automaticamente dal trigger che invoca questa funzione e contiene al suo interno l'operazione che ha scatenato il trigger stesso. In questo modo possiamo scrivere una sola funzione per gestire sia gli eventi dovuti ad un comando di update, ad un comando di insert e ad un comando di delete. La variabile user contiene invece il nome utente di chi ha eseguito il comando che ha poi scatenato il trigger. La funzione now() ritorna il tempo corrente nel formato timestamp. Una volta definita la funzione di aggiornamento dellin questo caso la successione temporale con cui vengono invocati i triggers quando si cancella una tupla dalla tabella barche e' la seguente: 1. TRIGGER aggiorna_statistiche (invocato dalla tabella Barche); 2. TRIGGER archivia_barca (invocato dalla tabella Barche); 3. TRIGGER aggiorna_statistiche (invocato dalla tabella Statistiche); In particolare il trigger 3 e' invocato in cascata dal trigger 1. -3-

Triggers Esercitazione 2 Si considerino le relazioni prodotti, ordini e prodotti_correlati e i seguenti schemi delle relazioni: prodotti (pid:integer, nome:char[20], quantita:integer); ordini (oid:integer, pid:integer, quantita:integer); prodotti_correlati(pid:integer, cid:integer); La relazione prodotti contiene l id del prodotto, il suo nome e la quantità di quel prodotto attualmente presente in magazzino. La relazione prodotti_correlati contiene l id di due prodotti che sono tra loro correlati. Una tupla della relazione prodotti_correlati si può esprimere dicendo che il prodotto cid è correlato con il prodotto pid. La relazione ordini contiene l id unico dell ordine, il pid del prodotto cui tale ordine si riferisce e la quantità da ordinare. Si considerino come esempio le seguenti istanze legali delle relazioni prodotti e prodotti correlati: prodotti pid nome quantita 1 Pizza 5 2 Coca Cola 4 3 Birra 3 4 Pasta 4 5 Sugo al Pesto 3 6 Sugo al Ragu 3 prodotti_correlati pid cid 1 2 1 3 4 5 4 6 Esercizio: Definire i vincoli di foreign key in modo opportuno, sapendo che un ordine non può essere fatto se il prodotto non è presente nella tabella prodotti e che due prodotti per essere correlati devono entrambi essere presenti nella tabella prodotti. -4-

Di seguito è riportato il codice di una funzione che emula il comportamento di un contatore autoincrementante. Esercizio: inserire la funzione di autocontatore come trigger invocato sull evento INSERT nella tabella ordini. CREATE OR REPLACE FUNCTION contatore() RETURNS TRIGGER AS $contatore$ DECLARE record ordini%rowtype; max ordini.oid%type; max := 0; FOR record IN SELECT * FROM ordini LOOP IF (ordini.oid > max) THEN max := record.oid; END LOOP; NEW.oid := max + 1; RETURN NEW; $contatore$ LANGUAGE plpgsql; CREATE TRIGGER aggiorna_oid BEFORE INSERT ON ordini FOR EACH ROW EXECUTE PROCEDURE contatore(); Esercizio: Definire un trigger che esegue una funzione di aggiornamento ordini ogni volta che la quantità di un certo prodotto scende al disotto di 3 pezzi. La funzione di aggiornamento ordini è una funzione che inserisce un nuovo ordine nella tabella ordini. Notare che questo trigger non si dovrà preoccupare di settare in modo opportuno il numero progressivo che identifica l id dell ordine in quanto questo viene fatto dal trigger sopra descritto. E sufficiente che il trigger che crea un nuovo ordine metta un valore qualsiasi nel campo oid. Soluzione: CREATE OR REPLACE FUNCTION crea_ordine() RETURNS TRIGGER AS $crea_ordine$ DECLARE -- Nessuna dichiarazione IF (NEW.quantita < 3) THEN INSERT INTO ordini SELECT '0', NEW.pid, '20'; $crea_ordine$ LANGUAGE plpgsql; CREATE TRIGGER aggiorna_ordini AFTER INSERT OR UPDATE ON prodotti FOR EACH ROW EXECUTE PROCEDURE crea_ordine(); -5-

Esercizio: Definire un trigger che esegue una funzione di aggiornamento ordini ogni volta che la quantità di un certo prodotto scende al disotto di 3 pezzi e che fa un ordine relativo anche ad ogni prodotto che è correlato con il prodotto la cui quantità è scesa al disotto di 3. Soluzione: CREATE OR REPLACE FUNCTION crea_ordine() RETURNS TRIGGER AS $crea_ordine$ DECLARE id prodotti_correlati.cid%type; IF (NEW.quantita < 3) THEN INSERT INTO ordini SELECT '0', NEW.pid, '20'; FOR id IN ( SELECT cid FROM prodotti_correlati WHERE pid = NEW.pid ) LOOP INSERT INTO ordini SELECT '0', id, '20'; END LOOP; $crea_ordine$ LANGUAGE plpgsql; CREATE TRIGGER aggiorna_ordini AFTER INSERT OR UPDATE ON prodotti FOR EACH ROW EXECUTE PROCEDURE crea_ordine(); -6-