TP3 : PL/SQL
Les déclencheurs
Première année
Exercice 1
Créer la table Trace_Salaire suivante :
Trace_Salaire( No_emp Number,
AncienSal Number(7,2),
NouveauSal Number(7,2),
Date_Modif Date,
Commentaire Varchar(30)) ;
Le commentaire concerne le type d’opération (UPDATE, INSERT, DELETE)
1) Créer un trigger qui permet de constituer l’historique de toutes les modifications apportées aux
salaires des employés.
2) Créer un trigger qui met la date du jour de la création d’une ligne dans la colonne Dt_Entree de la
table E_employe, pour chaque ligne, si Dt_Entree est à NULL lors de l’insertion.
3) Créer un trigger qui se déclenche sur la mise à jour de chaque ligne de la table E_employe et qui
renseigne la table E_augmentation.
Exercice 2
On considère le schéma suivant :
create table CAT_PROD(
NumCat NUMBER(3) PRIMARY KEY, -- Numéro de la catégorie du produit
PRIXACHATMAX NUMBER(9,2), -- Prix maximum du produit à l’achat
MARGEMAX NUMBER(7,2) -- Marge maximale à la vente
);
create table PRODS(
NumPROD Number(3) PRIMARY KEY, -- Numéro du produit
CatPROD Number(3) REFERENCES CAT_PROD(NumCat), -- Catégorie du produit
PrixACHAT Number(9,2), -- Prix d’achat effectif du produit
PrixVENTE Number(9,2), -- Prix de vente effective du produit
);
1) Ecrire un trigger qui vérifie lors de la mise à jour du prix de vente d’un produit que le prix de vente
ne dépasse pas la marge correspondant à la catégorie du produit, sinon, un message d’erreur doit
être retourné et la mise à jour avortée. De même, dans ce cas, on doit archiver dans la table
ARCH_PRODS les anciennes valeurs du produit et les nouvelles valeurs. Le trigger doit aussi vérifier
lors d’une promotion, que le prix de vente n’est pas inférieur au prix d’achat et lors de l’achat du
produit que le prix d’achat ne dépasse pas le prix maximum autorisé (PRIXACHATMAX)
1/2
La table ARCH_PRODS est comme suit :
create table arch_emps(
NumPROD Number(3), -- Numéro du produit concerné par la mise à jour
CatPROD Number(3), -- La catégorie du produit
PrixAchat Number(5,2), -- Le prix effectif d’achat du produit
OldPrixVente NUMBER(3), -- L’ancien prix de vente
NewPrixVente NUMBER(3), -- Nouveau prix de vente
);
2) Ecrire, un trigger qui, si le prix de vente n’est pas donné lors de l’insertion, calcule
automatiquement ce prix selon la catégorie du produit et la marge maximale et l’insère dans le tuple
à insérer.
3) Créer une vue, contenant : NumCAT, PRIXACHATMAX, NumPROD, PrixAchat, PrixVente.
4) Ecrire un trigger qui autorise l’insertion et la suppression à travers la vue selon la sémantique
suivante :
a. Si NumCat=NULL→ERREUR OU PrixAchat=NULL→ERRUR SINON le prix de vente peut être calculé
comme précédemment et le numéro de produit par une séquence.
b. Lors d’une suppression, seul le produit sera supprimé et archivé.
2/2