Compte-rendu de TP : Contrainte gérée / déclencheur / tests unitaires réalisés
Soit le modèle relationnel des données suivant :
immeuble(id, adrNum, adrVoie, adrCodePostal, adrVille, fibreOptique, parkingPrivatif) Clef primaire : id (autoincrémenté) Remarque : tous les attributs sont non null, fibreOptique et parkingPrivatif sont de type booléen appartement(idImmeuble, numAppart, description, loyer, superficie, terrasse, classeConso, chauffage, placeParking, prixParking) Clef primaire : idImmeuble, numAppart Clef étrangère : idImmeuble en référence à immeuble(id) Remarque : attributs NULL par défaut, placeParking est de type booléen piece(idImmeuble, idAppartement, numPiece, superficie, fonction) Clef primaire : idImmeuble, idAppartement, numPiece Clef étrangère : (idImmeuble, idAppartement) en référence à appartement(idImmeuble, numAppart) Remarque : attributs NULL par défaut
DROP TRIGGER IF EXISTS prixAppartBeforeInsert; DELIMITER $$ CREATE TRIGGER prixAppartBeforeInsert BEFORE INSERT ON appartement FOR EACH ROW BEGIN IF NEW.placeParking = 0 THEN SET NEW.prixParking := NULL; -- affectation de variable END IF; END $$ DELIMITER ;
IF NEW.placeParking = 0 AND NEW.prixParking IS NOT NULL THEN -- Interrompt la transaction en levant une erreur, i.e. empêche l’insertion (ou la modification) SIGNAL sqlstate '45000' SET message_text ='prix parking sans parking'; END IF;
-- Insertion d'un immeuble avec parking privatif INSERT INTO immeuble (Id, adrNum, adrVoie, adrCodePostal, adrVille, fibreOptique, parkingPrivatif) VALUES (1, '7', 'Place de l\'étoile', '45000', 'ORLEANS', 1, 1);
-- Insertion de deux appartements, l’un sans place de parking, l’autre avec une place de parking, et -- les deux ayant un prix de place de parking INSERT INTO appartement (immeuble, num, description, loyer, superficie, terrasse, classeConso, chauffage, placeParking, prixParking) VALUES (1, 1, 'Appartement 1.1', 825.00, 86, 1, 'C', 'E', 0, 75.00), (1, 2, 'Appartement 1.2', 750.00, 86, 1, 'C', 'E', 1, 80.00);