Vous êtes sur la page 1sur 3

https://developpement-informatique.com/article/355/exercice-3-corrige-sur-les-triggers-en-oracle.

Soit le schéma de base de données suivant:


  Etudiant(etud_id, nom:string, age:integer, niveau:string, section:string)
  Cours(c_design:string, heure_debut:time, salle: string, #ens_id:integer)
  Est_inscrit(#etud_id:integer, #c_design  : string)
  Enseignant(ens_id:integer, ens_nom:string, dep:string)

1. Ecrire un trigger max_etudiants permettant de limiter le nombre des étudiants inscrits à


chaque cours à 20 étudiants. Ce trigger doit lever une exception dans le cas de dépassement
à laquelle on veut associer le code -20006 et le message ‘nombre max d’étudiants atteint’.
CREATE OR REPLACE TRIGGER max_etudiants
AFTER INSERT ON est_inscrit FOR EACH ROW
DECLARE
    NB NUMBER;
BEGIN
    SELECT COUNT(*) INTO NB FROM est_inscrit WHERE
c_design=:NEW.c_design;
    IF NB>20 THEN
        RAISE_APPLICATION_ERROR(-20006, nombre max d’étudiants atteint ');
    END IF;
END;

2. Ecrire un trigger qui permet pour chaque insertion ou mise à jour d’un cours de vérifier
qu’uniquement les enseignants du département Informatique peuvent enseigner plus de 2
cours en lancant une exception avec le code -20007 et le message 'uniquement les
enseignants du département Informatique peuvent enseigner plus de 2
cours'.

CREATE OR REPLACE TRIGGER trig_2


AFTER INSERT OR UPDATE ON Cours FOR EACH ROW
DECLARE
    V_NB NUMBER;
    V_DEP varchar2;
BEGIN
    SELECT dep INTO V_DEP FROM Enseignant WHERE ens_id=:NEW.ens_id;
    SELECT COUNT(*) INTO V_NB FROM Cours WHERE ens_id =:NEW. ens_id;
    IF V_DEP!=’Informatique’ AND V_NB>2 THEN
        RAISE_APPLICATION_ERROR(-20007,'uniquement les enseignants du
département Informatique peuvent enseigner plus de 2 cours');
    END IF;
END;

3. Ecrire un trigger qui impose que chaque étudiant doit être inscrit au cours SGBD.

CREATE OR REPLACE TRIGGER quest_3


AFTER INSERT ON Etudiant FOR EACH ROW
BEGIN
    INSERT INTO est_inscrit VALUES(:NEW.etud_id,’SGBD');
END;
4. Ecrire un trigger qui impose que Le nombre d'élèves inscrits dans la section multimédia
doit être supérieur au nombre d'élèves dans la section Télécom. Dans le cas
contraire, lever une exception définie par l’utilisateur affichant le message 'Le
nombre d’élèves inscrits dans la section multimédia doit être
supérieur au nombre d élèves dans la section Télécom’

CREATE OR REPLACE TRIGGER quest_5


AFTER INSERT OR UPDATE ON Etudiant FOR EACH ROW
WHEN NEW.section='Multimedia' OR NEW.niveau='Télécom'
DECLARE
    V_NB1 NUMBER;
    V_NB2 NUMBER;
Exc exception ;
BEGIN
    SELECT COUNT(*) INTO V_NB1 FROM Etudiant WHERE section='Multimédia';
    SELECT COUNT(*) INTO V_NB2 FROM Etudiant WHERE section='Télécom';
    IF V_NB2<V_NB1 THEN
Raise exc ;
End if ;
        RAISE_APPLICATION_ERROR(-20005,'Le nombre d eleves inscrits dans
la section multimédia doit être superieur au nombre d eleves
dans la section .');
    END IF;

Exception
When exc then
DBMS_OUTOUT.PUT_LINE('Le nombre d’élèves inscrits dans la section
multimédia doit être supérieur au nombre d élèves dans la section
Télécom’ ) ;

END;

5. Ecrire un trigger qui permet de supprimer les inscriptions à un cours lors de la suppression de
celui-ci .

CREATE TRIGGER supp_cours

BEFORE DELETE ON cours

FOR EACH ROW

BEGIN

DELETE FROM est_inscrit WHERE c_design= :OLD.c_design;

dbms_output.put_line ('Ligne supprimée');

END ;

https://www.coursehero.com/file/23329198/AAAA-Correction-TP-BD2-triggers-plsql-fct-proc-
S6-V2-2016-OK-V2/

Définir un trigger en insertion permettant d’implémenter


une numérotation automatique de la clé Etud_id de la table
Etudiant. Le premier numéro doit être égal à 1
create or replace trigger inc before insert on etudiantfor each rowdeclareid
number;beginselect count(*) into id from etudiant;if id = 0then:new.numet := 1 ;elseselect
max(numet) into id from etudiant;:new.numet := id + 1;end if ; end ;

https://www.coursehero.com/file/60909740/TD3Corrigepdf/
Ecrire un trigger permettant de lever une exception dans le cas d'une diminution de salaire des
employés. Corrigé create or replace trigger Exemple2 before update of salary on employees for
each row begin if (:new.salary < :old.salary) thenraise_application_error (-20200, 'interdit de
diminuer le salaire'); end if; end;Departments Department_ID Department_name
PL/SQL – Exercices corrigés 3.Pour archiver l’ historique des opérations de mise à jour de la
table Employees, on a crée une table History (employee_id, operation_date, operation_type).
Ecrire un trigger permettant, après l’exécution de chaque opération surEmployees, d’ ajouter
un tuple concernant cette opération à la table History . Corrigé create or replace trigger
Exemple3 after update or insert or delete on employees for each row declare type_op
varchar2(6); id employees.employee_id%type; begin if (inserting) then type_op := 'insert';
id := :new.employee_id; elsif (updating) then type_op := 'update';id := :new.employee_id; else
type_op := 'delete';id := :old.employee_id; end if;
Insert into history values(id, sysdate, type_op) ;
End ;

Vous aimerez peut-être aussi