Exercices Corrigés:Triggers,Déclencheur

Soit le schéma relationnel suivant:
-- Table Cours
CREATE TABLE Cours (
    ID_Cours INT PRIMARY KEY,
    NomCours VARCHAR(255),
    CodeCours VARCHAR(20)
);

-- Table Enseignant
CREATE TABLE Enseignant (
    ID_Enseignant INT PRIMARY KEY,
    Nom VARCHAR(255),
    Prenom VARCHAR(255),
    Titre VARCHAR(50)
);

-- Table Inscription
CREATE TABLE Inscription (
    ID_Inscription INT PRIMARY KEY,
    ID_Etudiant INT,
    ID_Cours INT,
    Annee INT,
    FOREIGN KEY (ID_Etudiant) REFERENCES Etudiant(ID_Etudiant),
    FOREIGN KEY (ID_Cours) REFERENCES Cours(ID_Cours)
);
Questions & Réponse
Déclencheur pour mettre à jour la date de modification d'un enseignant :
DELIMITER //
CREATE TRIGGER UpdateEnseignantModified
BEFORE UPDATE ON Enseignant
FOR EACH ROW
SET NEW.DateModification = NOW();
//
DELIMITER ;
Déclencheur pour vérifier la validité de l'année lors de l'insertion d'une inscription :
DELIMITER //
CREATE TRIGGER CheckYearValidity
BEFORE INSERT ON Inscription
FOR EACH ROW
BEGIN
    IF NEW.Annee < YEAR(NOW()) THEN
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'L\'année d\'inscription ne peut pas être antérieure à l\'année actuelle.';
    END IF;
END;
//
DELIMITER ;
Déclencheur pour mettre à jour la moyenne générale d'un étudiant lors de l'insertion d'une note :
DELIMITER //
CREATE TRIGGER UpdateAverageGrade
AFTER INSERT ON Notes
FOR EACH ROW
BEGIN
    DECLARE avgGrade DECIMAL(5,2);

    SELECT AVG(Note) INTO avgGrade
    FROM Notes
    WHERE ID_Etudiant = NEW.ID_Etudiant;

    UPDATE Etudiant
    SET MoyenneGenerale = avgGrade
    WHERE ID_Etudiant = NEW.ID_Etudiant;
END;
//
DELIMITER ;
Déclencheur pour empêcher la suppression d'un enseignant lié à un cours :
DELIMITER //
CREATE TRIGGER PreventDeleteTeacherWithCourses
BEFORE DELETE ON Enseignant
FOR EACH ROW
BEGIN
    IF EXISTS (SELECT 1 FROM Cours WHERE ID_Enseignant = OLD.ID_Enseignant) THEN
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Impossible de supprimer un enseignant lié à un cours.';
    END IF;
END;
//
DELIMITER ;
Déclencheur pour mettre à jour la mention d'un étudiant lors de l'insertion d'une nouvelle inscription :
DELIMITER //
CREATE TRIGGER UpdateStudentMention
AFTER INSERT ON Inscription
FOR EACH ROW
BEGIN
    DECLARE avgGrade DECIMAL(5,2);

    SELECT AVG(Note) INTO avgGrade
    FROM Notes
    WHERE ID_Etudiant = NEW.ID_Etudiant;

    CASE
        WHEN avgGrade >= 16 THEN
            UPDATE Inscription SET Mention = 'Très Bien' WHERE ID_Etudiant = NEW.ID_Etudiant AND ID_Cours = NEW.ID_Cours;
        WHEN avgGrade >= 14 THEN
            UPDATE Inscription SET Mention = 'Bien' WHERE ID_Etudiant = NEW.ID_Etudiant AND ID_Cours = NEW.ID_Cours;
        WHEN avgGrade >= 12 THEN
            UPDATE Inscription SET Mention = 'Assez Bien' WHERE ID_Etudiant = NEW.ID_Etudiant AND ID_Cours = NEW.ID_Cours;
        ELSE
            UPDATE Inscription SET Mention = 'Non Classé' WHERE ID_Etudiant = NEW.ID_Etudiant AND ID_Cours = NEW.ID_Cours;
    END CASE;
END;
//
DELIMITER ;
Déclencheur pour mettre à jour le nombre d'étudiants inscrits lors de l'insertion ou la suppression d'une inscription :
DELIMITER //
CREATE TRIGGER UpdateEnrollmentCount
AFTER INSERT, DELETE ON Inscription
FOR EACH ROW
BEGIN
    UPDATE Cours
    SET NombreEtudiantsInscrits = (SELECT COUNT(*) FROM Inscription WHERE ID_Cours = NEW.ID_Cours)
    WHERE ID_Cours = NEW.ID_Cours;
END;
//
DELIMITER ;
Déclencheur pour empêcher la suppression d'un cours lié à une inscription existante :
DELIMITER //
CREATE TRIGGER PreventDeleteCourseWithEnrollment
BEFORE DELETE ON Cours
FOR EACH ROW
BEGIN
    IF EXISTS (SELECT 1 FROM Inscription WHERE ID_Cours = OLD.ID_Cours) THEN
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Impossible de supprimer un cours lié à une inscription existante.';
    END IF;
END;
//
DELIMITER ;
Déclencheur pour vérifier la validité d'une note lors de l'insertion ou la mise à jour d'une note :
DELIMITER //
CREATE TRIGGER CheckGradeValidity
BEFORE INSERT, UPDATE ON Notes
FOR EACH ROW
BEGIN
    IF NEW.Note < 0 OR NEW.Note > 20 THEN
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'La note doit être comprise entre 0 et 20.';
    END IF;
END;
//
DELIMITER ;
Déclencheur pour mettre à jour le statut de l'enseignant lors de la suppression d'un cours lié à cet enseignant :
DELIMITER //
CREATE TRIGGER UpdateTeacherStatus
AFTER DELETE ON Cours
FOR EACH ROW
BEGIN
    UPDATE Enseignant
    SET Statut = 'Inactif'
    WHERE ID_Enseignant = OLD.ID_Enseignant
        AND NOT EXISTS (SELECT 1 FROM Cours WHERE ID_Enseignant = OLD.ID_Enseignant);
END;
//
DELIMITER ;
Déclencheur pour mettre à jour le nombre d'inscriptions d'un étudiant lors de l'insertion ou la suppression d'une inscription :
DELIMITER //
CREATE TRIGGER UpdateStudentEnrollmentCount
AFTER INSERT, DELETE ON Inscription
FOR EACH ROW
BEGIN
    UPDATE Etudiant
    SET NombreInscriptions = (SELECT COUNT(*) FROM Inscription WHERE ID_Etudiant = NEW.ID_Etudiant)
    WHERE ID_Etudiant = NEW.ID_Etudiant;
END;
//
DELIMITER ;
Déclencheur pour mettre à jour le nombre de cours enseignés par un enseignant lors de la suppression d'un cours :
DELIMITER //
CREATE TRIGGER UpdateTeacherCourseCount
AFTER DELETE ON Cours
FOR EACH ROW
BEGIN
    UPDATE Enseignant
    SET NombreCoursEnseignes = (SELECT COUNT(*) FROM Cours WHERE ID_Enseignant = OLD.ID_Enseignant)
    WHERE ID_Enseignant = OLD.ID_Enseignant;
END;
//
DELIMITER ;
Déclencheur pour mettre à jour la liste des cours d'un enseignant lors de la suppression d'un cours :
DELIMITER //
CREATE TRIGGER UpdateTeacherCourseList
AFTER DELETE ON Cours
FOR EACH ROW
BEGIN
    UPDATE Enseignant
    SET CoursEnseignes = (SELECT GROUP_CONCAT(NomCours SEPARATOR ', ') FROM Cours WHERE ID_Enseignant = OLD.ID_Enseignant)
    WHERE ID_Enseignant = OLD.ID_Enseignant;
END;
//
DELIMITER ;
Déclencheur pour mettre à jour la moyenne générale d'un étudiant lors de la suppression d'une note :
DELIMITER //
CREATE TRIGGER UpdateAverageGradeOnNoteDelete
AFTER DELETE ON Notes
FOR EACH ROW
BEGIN
    DECLARE avgGrade DECIMAL(5,2);

    SELECT AVG(Note) INTO avgGrade
    FROM Notes
    WHERE ID_Etudiant = OLD.ID_Etudiant;

    UPDATE Etudiant
    SET MoyenneGenerale = avgGrade
    WHERE ID_Etudiant = OLD.ID_Etudiant;
END;
//
DELIMITER ;
Déclencheur pour mettre à jour la mention d'un étudiant lors de la suppression d'une inscription :
DELIMITER //
CREATE TRIGGER UpdateStudentMentionOnInscriptionDelete
AFTER DELETE ON Inscription
FOR EACH ROW
BEGIN
    DECLARE avgGrade DECIMAL(5,2);

    SELECT AVG(Note) INTO avgGrade
    FROM Notes
    WHERE ID_Etudiant = OLD.ID_Etudiant;

    CASE
        WHEN avgGrade >= 16 THEN
            UPDATE Inscription SET Mention = 'Très Bien' WHERE ID_Etudiant = OLD.ID_Etudiant AND ID_Cours = OLD.ID_Cours;
        WHEN avgGrade >= 14 THEN
            UPDATE Inscription SET Mention = 'Bien' WHERE ID_Etudiant = OLD.ID_Etudiant AND ID_Cours = OLD.ID_Cours;
        WHEN avgGrade >= 12 THEN
            UPDATE Inscription SET Mention = 'Assez Bien' WHERE ID_Etudiant = OLD.ID_Etudiant AND ID_Cours = OLD.ID_Cours;
        ELSE
            UPDATE Inscription SET Mention = 'Non Classé' WHERE ID_Etudiant = OLD.ID_Etudiant AND ID_Cours = OLD.ID_Cours;
    END CASE;
END;
//
DELIMITER ;
Déclencheur pour mettre à jour le nombre d'étudiants inscrits lors de la suppression d'une inscription :
DELIMITER //
CREATE TRIGGER UpdateEnrollmentCountOnInscriptionDelete
AFTER DELETE ON Inscription
FOR EACH ROW
BEGIN
    UPDATE Cours
    SET NombreEtudiantsInscrits = (SELECT COUNT(*) FROM Inscription WHERE ID_Cours = OLD.ID_Cours)
    WHERE ID_Cours = OLD.ID_Cours;
END;
//
DELIMITER ;
Déclencheur pour mettre à jour la liste des cours d'un enseignant lors de la suppression d'un cours :
DELIMITER //
CREATE TRIGGER UpdateTeacherCourseListOnCourseDelete
AFTER DELETE ON Cours
FOR EACH ROW
BEGIN
    UPDATE Enseignant
    SET CoursEnseignes = (SELECT GROUP_CONCAT(NomCours SEPARATOR ', ') FROM Cours WHERE ID_Enseignant = OLD.ID_Enseignant)
    WHERE ID_Enseignant = OLD.ID_Enseignant;
END;
//
DELIMITER ;
Déclencheur pour mettre à jour le nombre d'inscriptions d'un étudiant lors de la suppression de l'étudiant :
DELIMITER //
CREATE TRIGGER UpdateStudentEnrollmentCountOnStudentDelete
AFTER DELETE ON Etudiant
FOR EACH ROW
BEGIN
    UPDATE Etudiant
    SET NombreInscriptions = 0
    WHERE ID_Etudiant = OLD.ID_Etudiant;
END;
//
DELIMITER ;
Déclencheur pour supprimer les notes associées à un étudiant lors de la suppression de l'étudiant :
DELIMITER //
CREATE TRIGGER DeleteNotesOnStudentDelete
AFTER DELETE ON Etudiant
FOR EACH ROW
BEGIN
    DELETE FROM Notes
    WHERE ID_Etudiant = OLD.ID_Etudiant;
END;
//
DELIMITER ;
Déclencheur pour mettre à jour le nombre de cours enseignés par un enseignant lors de la suppression d'un enseignant :
DELIMITER //
CREATE TRIGGER UpdateTeacherCourseCountOnTeacherDelete
AFTER DELETE ON Enseignant
FOR EACH ROW
BEGIN
    UPDATE Enseignant
    SET NombreCoursEnseignes = 0
    WHERE ID_Enseignant = OLD.ID_Enseignant;
END;
//
DELIMITER ;
Déclencheur pour supprimer les cours associés à un enseignant lors de la suppression de l'enseignant :
DELIMITER //
CREATE TRIGGER DeleteCoursesOnTeacherDelete
AFTER DELETE ON Enseignant
FOR EACH ROW
BEGIN
    DELETE FROM Cours
    WHERE ID_Enseignant = OLD.ID_Enseignant;
END;
//
DELIMITER ;
Déclencheur pour mettre à jour la mention d'un étudiant lors de la suppression d'une note :
DELIMITER //
CREATE TRIGGER UpdateStudentMentionOnNoteDelete
AFTER DELETE ON Notes
FOR EACH ROW
BEGIN
    DECLARE avgGrade DECIMAL(5,2);

    SELECT AVG(Note) INTO avgGrade
    FROM Notes
    WHERE ID_Etudiant = OLD.ID_Etudiant;

    CASE
        WHEN avgGrade >= 16 THEN
            UPDATE Inscription SET Mention = 'Très Bien' WHERE ID_Etudiant = OLD.ID_Etudiant AND ID_Cours = OLD.ID_Cours;
        WHEN avgGrade >= 14 THEN
            UPDATE Inscription SET Mention = 'Bien' WHERE ID_Etudiant = OLD.ID_Etudiant AND ID_Cours = OLD.ID_Cours;
        WHEN avgGrade >= 12 THEN
            UPDATE Inscription SET Mention = 'Assez Bien' WHERE ID_Etudiant = OLD.ID_Etudiant AND ID_Cours = OLD.ID_Cours;
        ELSE
            UPDATE Inscription SET Mention = 'Non Classé' WHERE ID_Etudiant = OLD.ID_Etudiant AND ID_Cours = OLD.ID_Cours;
    END CASE;
END;
//
DELIMITER ;
Déclencheur pour mettre à jour la moyenne générale d'un étudiant lors de la suppression d'une note :
DELIMITER //
CREATE TRIGGER UpdateAverageGradeOnNoteDelete
AFTER DELETE ON Notes
FOR EACH ROW
BEGIN
    DECLARE avgGrade DECIMAL(5,2);

    SELECT AVG(Note) INTO avgGrade
    FROM Notes
    WHERE ID_Etudiant = OLD.ID_Etudiant;

    UPDATE Etudiant
    SET MoyenneGenerale = avgGrade
    WHERE ID_Etudiant = OLD.ID_Etudiant;
END;
//
DELIMITER ;
Déclencheur pour mettre à jour le nombre d'étudiants inscrits lors de la suppression d'une inscription :
DELIMITER //
CREATE TRIGGER UpdateEnrollmentCountOnInscriptionDelete
AFTER DELETE ON Inscription
FOR EACH ROW
BEGIN
    UPDATE Cours
    SET NombreEtudiantsInscrits = (SELECT COUNT(*) FROM Inscription WHERE ID_Cours = OLD.ID_Cours)
    WHERE ID_Cours = OLD.ID_Cours;
END;
//
DELIMITER ;
Déclencheur pour mettre à jour le nombre d'inscriptions d'un étudiant lors de la suppression d'un étudiant :
DELIMITER //
CREATE TRIGGER UpdateStudentEnrollmentCountOnStudentDelete
AFTER DELETE ON Etudiant
FOR EACH ROW
BEGIN
    UPDATE Etudiant
    SET NombreInscriptions = 0
    WHERE ID_Etudiant = OLD.ID_Etudiant;
END;
//
DELIMITER ;
Déclencheur pour mettre à jour le nombre de cours enseignés par un enseignant lors de la suppression d'un enseignant :
DELIMITER //
CREATE TRIGGER UpdateTeacherCourseCountOnTeacherDelete
AFTER DELETE ON Enseignant
FOR EACH ROW
BEGIN
    UPDATE Enseignant
    SET NombreCoursEnseignes = 0
    WHERE ID_Enseignant = OLD.ID_Enseignant;
END;
//
DELIMITER ;