La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

SQL: Lezione 8 Nataliya Rassadko

Presentazioni simili


Presentazione sul tema: "SQL: Lezione 8 Nataliya Rassadko"— Transcript della presentazione:

1 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 è: Unasserzione può ad esempio imporre che in un ipotetica tabella IMPIEGATO sia sempre presente almeno una riga La condizione deve essere vera quando viene creata lasserzione 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 listruzionde drop

6 ESERCIZIO Creare unasserzione che impedisca che esistano presidenti di studi cinematografici che hanno un netWorth inferiore a euro. CREATE ASSERTION "RichPres" CHECK (NOT EXISTS (SELECT * FROM "Studio","MovieExec WHERE "presC#"="cert#" AND "netWorth" < )); 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#)

7 ESERCIZIO Creare unasserzione 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 L1 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 linserimento, 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 Lazione può essere eseguita prima o dopo levento (UPDATE, INSERT, DELETE). Lazione può essere riferita sia ai vecchi che ai nuovi valori inseriti, cancellati o modificati durante levento. Levento 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 nelloperazione 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 TRIGGER: Esempio 1 Supponiamo di voler impedire labbassamento del valore netto di un produttore: 1 CREATE TRIGGER NetWorthTrigger 2 AFTER UPDATE OF netWorth ON MovieExec 3 REFERENCING OLD ROW AS OldTuple 4 NEW ROW AS NewTuple 5 FOR EACH ROW 6 WHEN (Old.netWorth > NewTuple.netWorth) 7 UPDATE MovieExec SET netWorth = OldTuple.netWorth 8 WHERE cert#=NewTuple.cert#; 1. Parole chiave CREATE TRIGGER 2. Evento Le tuple prima e dopo modifica 5. Modalità di trigger FOR EACH STATEMENT 6. Condizione: quando Azione

14 TRIGGER: Esempio 2 Prevenire la situazione quando avg(netWorth)< CREATE TRIGGER AvgNetWorthTrigger 2 AFTER UPDATE OF netWorth ON MovieExec 3 REFERENCING OLD TABLE AS OldStuff, 4 NEW TABLE AS NewStuff 5 FOR EACH STATEMENT 6 WHEN ( > SELECT AVG(netWorth) FROM MovieExec) 7 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 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) CREATE VIEW ParamountMovie AS SELECT title, year FROM Movie WHERE studioName=Paramount

16 TRANSAZIONI Una transazione e lesecuzione 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 allultimo COMMIT Aiuta a prevenire iproblemi 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 unatra 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 unaltra 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 (A1 150 A2), T2 (A2 250 A3) – 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 User 2 Airline database Il posto S36 e libero? - Si Il posto S36 e libero? - Si Prenota S36 -S36 e - prenotato per U1 Prenota S36 - Attenzione stai prenotando un posto occupato!! Time User 1

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 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 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: 1. Interrogare il db per conoscere il valore del netWorth 2. 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 lapposito 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 PCs 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 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 ships 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. 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) 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#)

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 M1 WHERE inColor=false GROUP BY studioName HAVING count(*)= (SELECT count(*) FROM Movie as M2 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 M1 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 lattributo 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.


Scaricare ppt "SQL: Lezione 8 Nataliya Rassadko"

Presentazioni simili


Annunci Google