Scaricare la presentazione
La presentazione è in caricamento. Aspetta per favore
PubblicatoRosaria Gagliardi Modificato 11 anni fa
1
Nataliya Rassadko rassadko@disi.unitn.it
SQL: Lezione 8 Nataliya Rassadko
2
Agenda Asserzioni Trigger Transazioni Concorrenza LOCK JDBC
3
ASSERZIONI Grazie alla clausola check è possibile definire anche un ulteriore componente dello schema di una base di dati: le asserzioni. Le asserzioni rappresentano dei vincoli che non sono associati a nessun attributo o tabella in particolare, ma appartengono direttamente allo schema.
4
ASSERZIONI La sintassi per la definizione di un asserzione è:
Un’asserzione può ad esempio imporre che in un ipotetica tabella IMPIEGATO sia sempre presente almeno una riga La condizione deve essere vera quando viene creata l’asserzione e deve rimanere vera sempre CREATE ASSERTION NomeAsserzione check(condizione) CREATE ASSERTION AlmenoUnImpiegato check ((Select count(*) from Impiegato)>=1)
5
ASSERZIONI Mediante le asserzioni è possibile esprimere tutti i vincoli che abbiamo specificato nella definizione delle tabelle. Le asserzioni permetono inoltre di esprimere vincoli che non sarebbero altrimenti definibili, come vincoli su più tabelle o vincoli, ad esempio, che richiedono la cardinalità minima di una tabella. Le asserzioni possiedono un nome, tramite il quale è possibile eliminarle esplicitamente dallo schema con l’istruzionde drop
6
ESERCIZIO Creare un’asserzione che impedisca che esistano presidenti di studi cinematografici che hanno un netWorth inferiore a euro. Movie(title,year,length,inColor,studioName,producerC#)StarsIn(movieTitle,movieYear,starName) MovieStar(name,address,gender,birthdate) MovieExec(name,address,cert#,netWorth) Studio(name,address,presC#) CREATE ASSERTION "RichPres" CHECK (NOT EXISTS (SELECT * FROM "Studio","MovieExec“ WHERE "presC#"="cert#" AND "netWorth" < ));
7
ESERCIZIO Creare un’asserzione che impedisca che esistano righe in StarsIn che contengono nomi di attori che non sono presenti nella tabella MovieStar Movie(title,year,length,inColor,studioName,producerC#)StarsIn(movieTitle,movieYear,starName) MovieStar(name,address,gender,birthdate) MovieExec(name,address,cert#,netWorth) Studio(name,address,presC#) CREATE ASSERTION “Star" CHECK (NOT EXISTS (SELECT starName FROM “StarIn“ WHERE starName NOT IN (Select name from MovieStar)));
8
ESERCIZIO Per ciascun reparto, con più di 20 impiegati a tempo pieno, (cioè dove le ore degli impiegati a tempo pieno e di quelli part-time assommano almeno a quel numero di ore per impiegati a tempo pieno), visualizzare il rid insieme al numero di impiegati che lavorano in quel reparto. Imp(iid:integer, inome:string, età:integer, salario:real) Rep(rid:integer, budget:real, direttoreid:integer) Lavora(iid:integer, rid:integer, pct_tempo:integer) SELECT L.rid, COUNT(L.iid) FROM Lavora L GROUP BY L.rid HAVING 3200 < ( SELECT SUM(L1.pct_tempo) FROM Lavora L WHERE L1.rid = L.rid)
9
TRIGGER I Trigger si basano sul paradigma : EVENTO-CONDIZIONE-AZIONE
Un trigger rappresenta una serie di azioni che sono associate ad un determinato evento, come l’inserimento, la modifica o la cancellazione.
10
TRIGGER Funzionamento del trigger si procede in tre passi:
I trigger sono attivati solo quando avvengono determinati eventi (inserzione, modifica, cancellazione) Invece di impedire immediatamente un evento, il trigger verifica prima una circostanza, se la circostanza e’ verifica, allora viene eseguita la corrispondente azione dal dbms
11
TRIGGER L’azione può essere eseguita prima o dopo l’evento (UPDATE, INSERT, DELETE). L’azione può essere riferita sia ai vecchi che ai nuovi valori inseriti, cancellati o modificati durante l’evento. L’evento modifica può essere limitato a un particolare attributo o a un set di attributi
12
TRIGGER Un trigger puo’ essere speficicato
Di tupla (row-level): attivazione per ogni riga coinvolta nell’operazione Di operazione (statemente-level) una sola attivazione per ogni istruzione SQL, con riferimento a tutte le tuple coinvolte Un trigger puo’ innescare un altro trigger e cosi’ via (sara’ compito del programmatore evitare problemi…)
13
1. Parole chiave CREATE TRIGGER 3. 4. Le tuple prima e dopo modifica
TRIGGER: Esempio 1 1. Parole chiave CREATE TRIGGER 2. Evento Supponiamo di voler impedire l’abbassamento del valore netto di un produttore: 3. 4. Le tuple prima e dopo modifica 5. Modalità di trigger FOR EACH STATEMENT 1 CREATE TRIGGER NetWorthTrigger AFTER UPDATE OF netWorth ON MovieExec REFERENCING OLD ROW AS OldTuple NEW ROW AS NewTuple FOR EACH ROW WHEN (Old.netWorth > NewTuple.netWorth) UPDATE MovieExec SET netWorth = OldTuple.netWorth WHERE cert#=NewTuple.cert#; 6. Condizione: quando 7. 8. Azione
14
TRIGGER: Esempio 2 Prevenire la situazione quando avg(netWorth)<500000 1 CREATE TRIGGER AvgNetWorthTrigger AFTER UPDATE OF netWorth ON MovieExec REFERENCING OLD TABLE AS OldStuff, NEW TABLE AS NewStuff FOR EACH STATEMENT WHEN ( > SELECT AVG(netWorth) FROM MovieExec) BEGIN 8 DELETE FROM MovieExec 9 WHERE (name, address, cert#, netWorth) IN NewStuff; 10 INSERT INTO MovieExec 11 (SELECT * FROM OldStuff); 12 END;
15
INSTEAD OF TRIGGER CREATE VIEW ParamountMovie AS SELECT title, year
FROM Movie WHERE studioName=‘Paramount’ 1 CREATE TRIGGER ParamountInsert 2 INSTEAD OF INSERT ON ParamountMovie 3 REFERENCING NEW ROW AS NewRow 5 FOR EACH ROW 6 INSERT INTO Movie (title, year, studioName) 7 VALUES (NewRow.title, NewRow.year, ‘Paramount’)
16
TRANSAZIONI Una transazione e’ l’esecuzione di un insieme di operazioni di lettura e scrittura di oggetti del db come un tutto indissolubile. Programma di utente in Embedded SQL in C Ovvero CLIENT di DB Esempi: Prelievo di denaro da un Bancomat Verificare un acquisto con carta di credito Prenotare un libro in libreria
17
TRANSAZIONI BEGIN Inizio del blocco del transazione COMMIT
Prima di COMMIT i risultati di operazione possono non essere visibili alle altre transazioni ROLLBACK Le modifiche sulla DB si cancellano fino all’ultimo COMMIT Aiuta a prevenire i’problemi causati di software/hardware failure
18
CONCORRENZA: Problema di serialization
Esistono tre situanzioni indesiderabili che possono accadere quando abbiamo transazioni concorrenti: dirty read Una transazione legge i dati scritti da una transazione simultanea non commitata nonrepeatable read Una transazione rilegge dei dati che ha precedentemente letto e li trova modificati da un’atra transizione. phantom read Una transizione esegue una query che ritorna un set di righe che soddisfano una condizione e trova che le righe soddisfacenti le condizioni sono state cambiate da un’altra transizione
19
Esempio: dirty read Algoritm di transazione di trasferimento di soldi:
Aggiungere soldi su conto-destinatario Controllare il conto-mettente Se i fondi non sono sufficienti, cancellare transazione Se i fondi sono sufficienti, sottrarre la somma dal conto-mittente A1: 100K, A2:200K, A3:300K, Totale:600K T1 (A1150A2), T2 (A2250A3) – transazioni concorrenti T1. A2: =350 T2. A3: =550 T2. A2:250? SI! Fare trasferimento T1. A1:150? NO! Cancellare trasferimento T2. A2: =100 T1. A2: =-50 Totale: 600K
20
CONCORRENZA Time Airline database User 1 User 2 Il posto S36 e’
libero? - Si Il posto S36 e’ libero? - Si Time Prenota S36 - Attenzione stai prenotando un posto occupato!! Prenota S36 S36 e’ prenotato per U1 Airline database
21
Esempio: nonrepeatable read
Due utenti (U1 e U2) accedono a un database per la gestione dei voli per prenotare il posto 36 (S36): U1 controlla se S36 e’ libero ed ottiene un risultato positivo U2 controlla se S36 e’ libero ed ottiene un risultato positivo U1 prenota S36 – adesso il posto non e’ piu’ libero U2 prova a prenotare S36 – ma il posto e’ gia uccopato
22
Transazione può scrivere Transazione può leggere i dati non commitati
Livello di isolazione Dirty read in applicazione bancario non è accetabile Nonrepeatable read in applicazione di prenotazione dei biglietti è accettabile SET TRANSACTION READ WRITE ISOLATION LEVEL READ UNCOMMITED BEGIN TRAN UPDATE Consultants SET HourlyRate = 150 WHERE ConsultantName = 'jacob' ; SELECT * FROM Consultants ; END Transazione può scrivere Transazione può leggere i dati non commitati Ovvero transazione può essere eseguita con un certo livello di isolazione
23
CONCORRENZA: Livelli di Isolazione
Ci sono 4 livelli di isolazione usati nelle transizioni: Il livello di isolazione delle transizioni e’ definito tramite: SET TRANSACTION <isolation level> Nuova transazione non inizia prima di fine della transazione precedente
24
LOCK Altra tecnica spesso usata sono i locks (serrature) sui dati condivisi: bloccaggio a livello di comando. tutto il db, una tabella, una tupla, un campo di una tupla. due transazioni non possono tenere due locks in conflitto sulla stessa tabella allo stesso tempo. i lock non conflittuali possono essere tenuti contemporanemante da diverse transizioni.
25
DEADLOCK Attenzione ai DeadLocks:
e.g., transazione T1 pone un lock sulla tabella A e richiede la tabella B. Allo stesso tempo, T2 pone un lock su B e richiede A PostgreSQL risolve automaticamente il deadlock abortendo una delle due transazioni coinvolte
26
LOCK Sintassi di base: LOCK [TABLE] name [, ...][IN lockmode MODE]
lockmode può essere ACCESS SHARE | ROW SHARE | ROW EXCLUSIVE | SHARE UPDATE EXCLUSIVE | SHARE | SHARE ROW EXCLUSIVE | EXCLUSIVE | ACCESS EXCLUSIVE
27
LOCK Supponiamo di voler incrementare di euro il valore netto del produttore del film “Meet the Fockers” se il corrente valore e’ minore di euro. Per fare questo e’ necessario: Interrogare il db per conoscere il valore del netWorth Controllare se il valore è minore di Se la condizione e’ vera, incrementare il valore di ,
28
LOCK Mentre si eseguono i passi 2 e 3, qualsiasi altra transazione potrebbe cambiare il valore di netWorth facendo in modo che che la condizione non sia piu’ vera. Possiamo bloccare la tabella MovieExec in modo EXCLUSIVE perche’ cio’ non accada
29
LOCK BEGIN WORK; LOCK TABLE imdb."MovieExec" IN EXCLUSIVE MODE;
int certNum=SELECT "producerC#" FROM imdb."Movie" WHERE "title"='Meet the Fockers'; int netWorth=SELECT "netWorth" FROM imdb."MovieExec" WHERE "cert#"=certNum; if (netWorth< ){ UPDATE imdb."MovieExec" SET "netWorth"="netWorth" WHERE "cert#"=certNum; } COMMIT WORK;
30
JDBC Java Database Connectivity (JDBC)
è un interfaccia per database che consente l'accesso alle basi di dati da qualsiasi programma scritto con il linguaggio di programmazione JAVA, indipendentemente dal DBMS
31
JDBC È costituita da una API
raggruppata nel package java.sql, che serve ai client per connettersi a un database. Fornisce metodi per interrogare e modificare le basi di dati.
32
JDBC Passi base per usare JDBC :
Caricare l’apposito JDBC driver per il db in uso (PostgreSQL offre differenti driver per diverse versioni del db e di java) Stabilire una connession con il db Creare uno statement Sottomettere le query al database (il risultato delle query puo’ essere letto usando la classe ResultSet)
33
JDBC Class.forName("org.postgresql.Driver");
//locate PostgreSQL JDBC driver String url = "jdbc:postgresql://" + host + "/" + db; Properties props = new Properties(); props.setProperty("user", user);//setting user name props.setProperty("password", passwrd);//setting password Connection con = DriverManager.getConnection(url, props);//getting connection to the database Statement st = con.createStatement();//creating a statement ResultSet rs = st.executeQuery(“SELECT * FROM imdb.\"MovieExec\" WHERE \"cert#\"=9713;”);//retrieving query results Rs.next();//move to the first result row String name = rs.getString("name");//read name of the producer
34
Esercizi: Creazione degli schemi
Creare gli schemi per Product (maker, model, type) PC(model, speed, ram, hd, rd, price) Laptop(model, speed, ram, hd, screen, price) Printer(model, color, type, price) Classes(class, type, country, numGuns, bore, displacement) Ships(name, class, launched) Battles(name, date) Outcomes(ship, battle, result)
35
Esercizi: TRIGGER e/o ASSERTION per PC
When updating PC, check that there is no lower priced PC with the same speed No manufacturer of a PC’s may also make laptop A manufacturer of a PC must also make a laptop with at least as great as a processor speed When inserting a new printer, check that the model number exists in Product table When making any modification to Laptop relation, check that the average price of laptops for each manufacturer is at least $2000 When updating RAM or hard disk of any PC, check that the updated PC has at least 100 times as much hard disk as RAM If a laptop has a larger main memory than a PC, then the laptop must also have a higher price than the PC When inserting a new PC, laptop, or printer, make sure that the model number did not previously appear in any of PC, Laptop, Printer If the relation Product mentions a model and its type, then this model must appear in the relation appropriate to that type
36
Esercizi: TRIGGER e/o ASSERTION per Ships
When a new class is inserted into Classes, also insert a ship with the name of that class and a NULL launch date When a new class is inserted with a displacement greater than tons, allow the insertion, but change the displacement to 35000 No class may have more than 2 ships No country may have both battleships and battlecruisers No ship with more than 9 guns may be in a battle with a ship having fewer than 9 guns that was sunk If a tuple is inserted into Outcomes, check that the ship and battle are listed in Ships and Battles respectively, and if not, insert tuples into one or both of these relations, with NULL components where necessary When there is an insertion into Ships oa an update of the “class” attribute of Ships, check that no country has more than 20 ships No ship may be launched before the ship that bears the name of the first ship’s class For every class there is a ship with the name of that class
37
ESERCIZIO Visualizzare i produttori di film (almeno 1) in cui recitano almeno 10 attori romani. Movie(title,year,length,inColor,studioName,producerC#)StarsIn(movieTitle,movieYear,starName) MovieStar(name,address,gender,birthdate) MovieExec(name,address,cert#,netWorth) Studio(name,address,presC#) SELECT MovieExec.name,MovieExec.address FROM Movie,MovieExec WHERE Movie.producerC#=MovieExec.cert# and title in (SELECT title FROM Movie,StarIn,MovieStar WHERE Movie.title=StarsIn.movieTitle and Movie.year=StarsIn.movieYear and MovieStar.name=StarIn.starName and MovieStar.address LIKE ‘%Roma%’ GROUP BY title HAVING COUNT(*)>=10)
38
ESERCIZIO Visualizzare i nomi degli Studi Cinematografici che hanno prodotto la metà dei propri film in bianco e nero. Movie(title,year,length,inColor,studioName,producerC#)StarsIn(movieTitle,movieYear,starName) MovieStar(name,address,gender,birthdate) MovieExec(name,address,cert#,netWorth) Studio(name,address,presC#) SELECT studioName FROM Movie as M WHERE inColor=‘false’ GROUP BY studioName HAVING count(*)= (SELECT count(*) FROM Movie as M WHERE inColor=‘true’ and M1.studioName=M2.studioName)
39
ESERCIZIO Visualizzare tutti gli attori di sesso femminile che abbiano partecipato a dei film con lunghezza superiore alla durata minima di tutti i film. Movie(title,year,length,inColor,studioName,producerC#)StarsIn(movieTitle,movieYear,starName) MovieStar(name,address,gender,birthdate) MovieExec(name,address,cert#,netWorth) Studio(name,address,presC#) SELECT MovieStar.* FROM MovieStar WHERE gender=‘f’ and name in (SELECT starName FROM StarIn, Movie WHERE movieTitle=title and movieYear=year and length>=(Select Min(length) FROM Movie)
40
ESERCIZIO Visualizzare i produttori-attori (persone che hanno recitato nei film da loro stessi prodotti) che vivono a Parigi (Paris). Movie(title,year,length,inColor,studioName,producerC#)StarsIn(movieTitle,movieYear,starName) MovieStar(name,address,gender,birthdate) MovieExec(name,address,cert#,netWorth) Studio(name,address,presC#) SELECT MovieExec.* FROM MovieExec as M WHERE name in (SELECT starName FROM StarIn, Movie WHERE movieTitle=title and movieYear=year and Movie.producerC# =M1.cert#) AND MovieExec.address LIKE ‘%Paris%’
41
ESERCIZIO Movie (title, year, length, inColor, studioName, producerC#) StarsIn (movieTitle, movieYear, starName) MovieStar (name, address, gender, birthdate) MovieExec (name, address, cert#, netWorth) Studio (name, address, presC#) Ricostruire il db relazionale nello schema work, tenendo in considerazione: Dividere la tabella Movie in 2: MovieColor (con i film a colori) e MovieBW (film in bianco e nero) senza l’attributo INCOLOR. Nella tabella Studio introdurre un attributo per memorizzare il nome del presidente Specificare il valore di default per gli attributi quando credete che siano utili.
Presentazioni simili
© 2024 SlidePlayer.it Inc.
All rights reserved.