Controllo su un vincolo nel database delle piscine comunali di Torino
Salve a tutti. Mi sono appena cimentato nella creazione di database, con sql, e mi sono imbattuto in questo esercizio https://docplayer.it/5275050-Progettazione-di-basi-di-dati-temi-d-esame-svolti.html quello riguardante la gestione delle piscine comunali di torino. Per quanto riguarda all'entità tempo nell'associazione ternaria "rotazione" l'ho concepito come coppia degli attributi (giorno,ora) (la sua PK), così come sono organizzate le ore di lezione in una scuola: lunedì prima, seconda......ora, martedì........ecc. Quello che vorrei fare nella realizzazione in sql è effettuare un controllo nella "tabella ponte" rotazione(insegnante,piscina,giorno,ora) dell'associazione ternaria in modo tale che l'insegnante inserito in tale tabella abbia la qualifica necessaria per insegnare un determinato corso (coppia piscina, tipo corso cfr. riferimento esterno in tiene). Le tabelle in grado di effettuare tale collegamento alla tabella rotazione sono (almeno io le ho chiamate così) Qualificazioni e Orario_Corsi. Poichè qualifica in Insegnante è un attributo multivalore si introduce un'associazione molti a molti ove Qualificazioni(insegnante,qualifica) costituisce la tabella ponte. A sua volta Orario _Corsi(piscina,tipo,giorno,ora) è la tabella ponte dell'associazione lezione (basso destra). Si noti che tipo corso altri non è che qualifica!
La mia idea era di fare un trigger da azionare allorquando si inserisce una riga in rotazione e controllare, tramite un select count, se le righe di una determinata tabella join per un determinato insegnante sono nulle in corrispondenza di Qualificazioni.qualifica = Orario_Corsi.tipo e per Orario_Corsi.giorno = Rotazione.giorno e Orario_Corsi.ora = Rotazione.ora. In tal caso faccio fare al trigger un roll back. Non riesco però ad organizzare bene le "concatenazioni" nel trigger, qualcuno ha un'idea di come fare per sbrogliare la matassa?
La mia idea era di fare un trigger da azionare allorquando si inserisce una riga in rotazione e controllare, tramite un select count, se le righe di una determinata tabella join per un determinato insegnante sono nulle in corrispondenza di Qualificazioni.qualifica = Orario_Corsi.tipo e per Orario_Corsi.giorno = Rotazione.giorno e Orario_Corsi.ora = Rotazione.ora. In tal caso faccio fare al trigger un roll back. Non riesco però ad organizzare bene le "concatenazioni" nel trigger, qualcuno ha un'idea di come fare per sbrogliare la matassa?
Risposte
Stavo pensando per ottenere il tipo di corso basterebbe eseguire la query:
Dovrò allora annullare l'update nella tabella Rotazione quando un determinato insegnante non ha la qualifica che coincide con il tipo di corso. Per far ciò dovrò andare a contare il numero di righe nella tabella Qualificazioni nelle quali compare l'insegnante in questione (Rotazione.insegnante) e come valore dell'attributo Qualificazioni.qualifica il tipo di corso ovvero il risultato della query sopra scritta. Se questo conteggio risulta nullo allora dovrò effettuare il Rollback. Perciò il trigger dovrebbe essere:
E' corretto così?
select tipo from Rotazione,OrarioCorsi where Rotazione.giorno = OrarioCorsi.giorno and Rotazione.ora = OrarioCorsi.ora
Dovrò allora annullare l'update nella tabella Rotazione quando un determinato insegnante non ha la qualifica che coincide con il tipo di corso. Per far ciò dovrò andare a contare il numero di righe nella tabella Qualificazioni nelle quali compare l'insegnante in questione (Rotazione.insegnante) e come valore dell'attributo Qualificazioni.qualifica il tipo di corso ovvero il risultato della query sopra scritta. Se questo conteggio risulta nullo allora dovrò effettuare il Rollback. Perciò il trigger dovrebbe essere:
Create trigger Insegnanti_Idonei after update on Rotazione for each row begin if(select count(*) from Qualificazioni where Qualificazioni.insegnante = Rotazione.insegnante and Qualificazione.qualifica = (select tipo from Rotazione, OrarioCorsi where Rotazione.giorno = OrarioCorsi.giorno and Rotazione.ora = OrarioCorsi.ora))=0 Rollback Transaction end
E' corretto così?