La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Università di Modena e Reggio Emilia 1 DB unimo Decomposizione Schemi e Trigger.

Presentazioni simili


Presentazione sul tema: "Università di Modena e Reggio Emilia 1 DB unimo Decomposizione Schemi e Trigger."— Transcript della presentazione:

1 Università di Modena e Reggio Emilia 1 DB Group @ unimo Decomposizione Schemi e Trigger

2 Università di Modena e Reggio Emilia 2 DB Group @ unimo Tabella R SquadraGiocatoreRuolo ItaliaBergomiTerzinoDestro ItaliaBergomiLibero ItaliaMorieroAlaDestra BrasileRonaldoCentravanti ArgentinaSimeoneCentrocampista Dipendenze funzionali: F = {SR G, G S} La tupla (Argentina, Zanetti, Centrocampista) non è ammessa perché viola la dipendenza SR G.

3 Università di Modena e Reggio Emilia 3 DB Group @ unimo Decomposizione che non preserva i dati SquadraRuolo ItaliaTerzinoDestro ItaliaLibero ItaliaAlaDestra BrasileCentroavanti ArgentinaCentrocampista GiocatoreSquadra BergomiItalia MorieroItalia RonaldoBrasile SimeoneArgentina π SR (R) π GS (R) GiocatoreSquadraRuolo BergomiItaliaTerzinoDestro MorieroItaliaTerzinoDestro BergomiItaliaLibero MorieroItaliaLibero BergomiItaliaAlaDestra MorieroItaliaAlaDestra RonaldoBrasileCentroavanti SimeoneArgentinaCentrocampista π GS (R) join π SR (R) Questa decomposizione non preserva le dipendenze funzionali. E possibile inserire nelle tabelle le due tuple: (Argentina, Centrocampista) e (Zanetti, Argentina)

4 Università di Modena e Reggio Emilia 4 DB Group @ unimo Decomposizione che preserva i dati GiocatoreRuolo BergomiTerzinoDestro BergomiLibero MorieroAlaDestra RonaldoCentroavanti SimeoneCentrocampista GiocatoreSquadra BergomiItalia MorieroItalia RonaldoBrasile SimeoneArgentina π GR (R) π GS (R) π GS (R) join π SR (R) GiocatoreRuoloSquadra BergomiLiberoItalia BergomiTerzinoDestroItalia MorieroAlaDestraItalia RonaldoCentroavantiBrasile SimeoneCentrocampistaArgentina Questa decomposizione preserva i dati.

5 Università di Modena e Reggio Emilia 5 DB Group @ unimo Trigger su R Per conservare le dipendenze funzionali sulla tabella R prima di tutto dichiariamo una chiave composta da tutti i campi. Primary key(squadra, giocatore, ruolo) Per conservare le dipendenze funzionali serve un trigger sulla tabella R che controlli gli inserimenti e gli update sulle tuple della tabella R.

6 Università di Modena e Reggio Emilia 6 DB Group @ unimo Trigger su R (cont.) CREATE TRIGGER Controllo_DF_R ON R FOR INSERT, UPDATE AS --- Dichiaro delle variabili di comodo Declare @s nvarchar(50), @g nvarchar(50), @is nvarchar(50), @cont int -- controllo S,R --> G -- recupero i valori inseriti facendo uso della tabella temporanea "inserted" Select @cont = count(*) from R, inserted where R.squadra = inserted.squadra and R.ruolo = inserted.ruolo and R.giocatore <> inserted.giocatore if @cont > 0 begin raiserror('Il ruolo che si vuole inserire per la squadra scelta ha già un giocatore.',16,1) rollback transaction end

7 Università di Modena e Reggio Emilia 7 DB Group @ unimo Trigger su R -- controllo G --> S Select @g = R.giocatore, @s = R.squadra, @is = inserted.squadra fromR, inserted whereR.giocatore = inserted.giocatore andR.squadra <> inserted.squadra andR.ruolo <> inserted.ruolo if (@g <> '') and (@s <> @is) begin raiserror('Il giocatore che si vuole inserire può appartenere a una sola squadra.',16,1) rollback transaction end go

8 Università di Modena e Reggio Emilia 8 DB Group @ unimo Trigger su GR Sulla tabella GR viene definita la chiave PRIMARY KEY(giocatore, ruolo) e viene definito il seguente trigger per preservare le dipendenze. Trigger per il controllo degli update. CREATE TRIGGER Controllo_DF_GR_UP ON GR FOR UPDATE AS --- Dichiaro delle variabili di comodo Declare @contG int, @cont int -- recupero i valori inseriti facendo uso della tabella temporanea "inserted" Select @contG = count(*) from GS,inserted where GS.giocatore = inserted.giocatore

9 Università di Modena e Reggio Emilia 9 DB Group @ unimo Trigger su GR -- recupero i valori inseriti facendo uso della tabella temporanea "inserted" Select @cont = count(*) from GR, GS,inserted where GR.giocatore = GS.giocatore and GR.ruolo = inserted.ruolo andGR.giocatore <> inserted.giocatore if @contG = 0 begin raiserror('Il giocatore non appartiene a nessuna squadra!',16,1) rollback transaction end else if @cont > 0 begin raiserror('Il ruolo che si vuole inserire ha già un giocatore per quella squadra!',16,1) rollback transaction end go

10 Università di Modena e Reggio Emilia 10 DB Group @ unimo Trigger su GR Creo un trigger per controllare gli inserimenti. CREATE TRIGGER Controllo_DF_GR ON GR FOR INSERT AS --- Dichiaro delle variabili di comodo Declare @contG int, @cont int -- recupero i valori inseriti facendo uso della tabella temporanea "inserted" Select @contG = count(*) from GS,inserted where GS.giocatore = inserted.giocatore

11 Università di Modena e Reggio Emilia 11 DB Group @ unimo Trigger su GR -- recupero i valori inseriti facendo uso della tabella temporanea "inserted" Select @cont = count(GR.ruolo) from GR, GS,inserted where GR.giocatore = GS.giocatore and GR.ruolo = inserted.ruolo andGS.giocatore <> inserted.giocatore andGS.squadra = (select squadra from GS, inserted where GS.giocatore = inserted.giocatore) group by GR.ruolo if @contG = 0 begin raiserror('Il giocatore non appartiene a nessuna squadra!',16,1) rollback transaction end else if @cont > 0 begin raiserror('Il ruolo che si vuole inserire ha già un giocatore per quella squadra!',16,1) rollback transaction end go

12 Università di Modena e Reggio Emilia 12 DB Group @ unimo Trigger su GS Sulla tabella GS viene definita una chiave solo sul giocatore. In questo modo è conservata la dipendenza funzionale G S. Primary key(giocatore) Scrivo un trigger per controllare le modifiche fatte alle tuple presenti in GS. In particolare controllo che nel caso si cambi la squadra di un giocatore, esso non abbia ruoli già presenti per la squadra modificata. CREATE TRIGGER Controllo_DF_GS ON GS FOR UPDATE AS --- Dichiaro delle variabili di comodo Declare @cont int

13 Università di Modena e Reggio Emilia 13 DB Group @ unimo Trigger su GS -- recupero i valori inseriti facendo uso della tabella temporanea "inserted" Select @cont = count(GR.ruolo) from GR, GS,inserted where GR.giocatore = GS.giocatore and GR.ruolo in (select GR.ruolo from GR, inserted where GR.giocatore = inserted.giocatore) andGS.giocatore <> inserted.giocatore andGS.squadra = (select GS.squadra from GS, inserted where GS.giocatore = inserted.giocatore) if @cont > 0 begin raiserror('Non è possibile modificare la squadra del giocatore!',16,1) rollback transaction end go


Scaricare ppt "Università di Modena e Reggio Emilia 1 DB unimo Decomposizione Schemi e Trigger."

Presentazioni simili


Annunci Google