130 likes | 218 Views
Decomposizione Schemi e Trigger. Tabella R. Dipendenze funzionali: F = {SR G, G S } La tupla (Argentina, Zanetti, Centrocampista) non è ammessa perché viola la dipendenza SR G. Decomposizione che non preserva i dati. π SR (R). π GS (R) join π SR (R). π GS (R).
E N D
Tabella R Dipendenze funzionali: F ={SR G, G S} La tupla (Argentina, Zanetti, Centrocampista) non è ammessa perché viola la dipendenza SR G.
Decomposizione che non preserva i dati πSR(R) πGS(R) join πSR(R) πGS(R) E’ possibile inserire nelle tabelle le due tuple: (Argentina, Centrocampista) e (Zanetti, Argentina) Questa decomposizione non preserva le dipendenze funzionali.
Decomposizione che preserva i dati πGR(R) πGS(R) join πSR(R) πGS(R) Questa decomposizione preserva i dati.
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.
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
Trigger su R -- controllo G --> S Select @g = R.giocatore, @s = R.squadra, @is = inserted.squadra from R, inserted where R.giocatore = inserted.giocatore and R.squadra <> inserted.squadra and R.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
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
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 and GR.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
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
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 and GS.giocatore <> inserted.giocatore and GS.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
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
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) and GS.giocatore <> inserted.giocatore and GS.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