Università di Modena e Reggio Emilia 1 DB unimo Decomposizione Schemi e Trigger
Università di Modena e Reggio Emilia 2 DB 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.
Università di Modena e Reggio Emilia 3 DB 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)
Università di Modena e Reggio Emilia 4 DB 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.
Università di Modena e Reggio Emilia 5 DB 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.
Università di Modena e Reggio Emilia 6 DB unimo Trigger su R (cont.) CREATE TRIGGER Controllo_DF_R ON R FOR INSERT, UPDATE AS --- Dichiaro delle variabili di comodo int -- controllo S,R --> G -- recupero i valori inseriti facendo uso della tabella temporanea "inserted" = count(*) from R, inserted where R.squadra = inserted.squadra and R.ruolo = inserted.ruolo and R.giocatore <> inserted.giocatore > 0 begin raiserror('Il ruolo che si vuole inserire per la squadra scelta ha già un giocatore.',16,1) rollback transaction end
Università di Modena e Reggio Emilia 7 DB unimo Trigger su R -- controllo G --> S = = = inserted.squadra fromR, inserted whereR.giocatore = inserted.giocatore andR.squadra <> inserted.squadra andR.ruolo <> inserted.ruolo if <> '') and begin raiserror('Il giocatore che si vuole inserire può appartenere a una sola squadra.',16,1) rollback transaction end go
Università di Modena e Reggio Emilia 8 DB 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 int -- recupero i valori inseriti facendo uso della tabella temporanea "inserted" = count(*) from GS,inserted where GS.giocatore = inserted.giocatore
Università di Modena e Reggio Emilia 9 DB unimo Trigger su GR -- recupero i valori inseriti facendo uso della tabella temporanea "inserted" = count(*) from GR, GS,inserted where GR.giocatore = GS.giocatore and GR.ruolo = inserted.ruolo andGR.giocatore <> inserted.giocatore = 0 begin raiserror('Il giocatore non appartiene a nessuna squadra!',16,1) rollback transaction end else > 0 begin raiserror('Il ruolo che si vuole inserire ha già un giocatore per quella squadra!',16,1) rollback transaction end go
Università di Modena e Reggio Emilia 10 DB 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 int -- recupero i valori inseriti facendo uso della tabella temporanea "inserted" = count(*) from GS,inserted where GS.giocatore = inserted.giocatore
Università di Modena e Reggio Emilia 11 DB unimo Trigger su GR -- recupero i valori inseriti facendo uso della tabella temporanea "inserted" = 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 = 0 begin raiserror('Il giocatore non appartiene a nessuna squadra!',16,1) rollback transaction end else > 0 begin raiserror('Il ruolo che si vuole inserire ha già un giocatore per quella squadra!',16,1) rollback transaction end go
Università di Modena e Reggio Emilia 12 DB 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 int
Università di Modena e Reggio Emilia 13 DB unimo Trigger su GS -- recupero i valori inseriti facendo uso della tabella temporanea "inserted" = 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) > 0 begin raiserror('Non è possibile modificare la squadra del giocatore!',16,1) rollback transaction end go