BUT2FA BD

This commit is contained in:
2026-01-15 13:31:16 +01:00
commit 22f16cb959
17 changed files with 1283 additions and 0 deletions

BIN
TP2/2_TP_PLSQL.pdf Normal file

Binary file not shown.

164
TP2/CG_TP2.txt Normal file
View File

@@ -0,0 +1,164 @@
1. Implémenter les questions du TD
(Cela dépend des questions vues en TD. Tu peux exécuter ici celles qui sont pertinentes pour ton TP.)
2. Trigger trg_DeleteCommande pour gérer la suppression des commandes
Lorsquune commande est supprimée, toutes ses lignes de commande associées doivent être supprimées :
CREATE OR REPLACE TRIGGER trg_DeleteCommande
BEFORE DELETE ON Commande
FOR EACH ROW
BEGIN
-- Supprimer les lignes de commande associées à la commande supprimée
DELETE FROM ligne_commande WHERE commande_id = :OLD.id;
END;
/
3. Trigger trg_DeleteClient pour gérer la suppression dun client
Lorsquun client est supprimé, toutes ses commandes et leurs lignes de commande doivent être supprimées :
CREATE OR REPLACE TRIGGER trg_DeleteClient
BEFORE DELETE ON Client
FOR EACH ROW
BEGIN
-- Supprimer les lignes de commande associées aux commandes du client
DELETE FROM ligne_commande
WHERE commande_id IN (SELECT id FROM Commande WHERE client_id = :OLD.id);
-- Supprimer les commandes du client
DELETE FROM Commande WHERE client_id = :OLD.id;
END;
/
4. Alternative aux triggers des questions 2 et 3
Plutôt que dutiliser des triggers, on peut utiliser des contraintes de suppression en cascade (ON DELETE CASCADE) dans la création des tables. Cela garantit que la suppression dun enregistrement entraîne automatiquement la suppression des enregistrements associés.
Exemple lors de la création des tables :
ALTER TABLE Commande
ADD CONSTRAINT fk_client_commande FOREIGN KEY (client_id)
REFERENCES Client(id) ON DELETE CASCADE;
ALTER TABLE ligne_commande
ADD CONSTRAINT fk_commande_ligne FOREIGN KEY (commande_id)
REFERENCES Commande(id) ON DELETE CASCADE;
✅ Avantage : Plus efficace que les triggers, car cela est géré automatiquement par le moteur de la base de données.
5. Historisation des clients supprimés
a) Création de la table Client_His pour stocker les anciens clients :
CREATE TABLE Client_His (
id INT PRIMARY KEY,
prenom VARCHAR2(50),
nom VARCHAR2(50),
email VARCHAR2(100),
ville VARCHAR2(50),
date_suppression DATE DEFAULT SYSDATE
);
b) Modification du trigger trg_DeleteClient pour enregistrer les clients supprimés :
CREATE OR REPLACE TRIGGER trg_DeleteClient
BEFORE DELETE ON Client
FOR EACH ROW
BEGIN
-- Insérer les informations du client supprimé dans la table Client_His
INSERT INTO Client_His (id, prenom, nom, email, ville, date_suppression)
VALUES (:OLD.id, :OLD.prenom, :OLD.nom, :OLD.email, :OLD.ville, SYSDATE);
-- Supprimer les lignes de commande associées
DELETE FROM ligne_commande
WHERE commande_id IN (SELECT id FROM Commande WHERE client_id = :OLD.id);
-- Supprimer les commandes du client
DELETE FROM Commande WHERE client_id = :OLD.id;
END;
/
✅ Avantage : Permet de conserver un historique des clients supprimés.
6. Audit de la table Commande
a) Création de la table CommandeAuditLog :
CREATE TABLE CommandeAuditLog (
Utilisateur VARCHAR2(100),
ActionSQL VARCHAR2(3),
DateMAJ DATE,
ActCol VARCHAR2(200)
);
b) Trigger trg_AuditCommande pour enregistrer les actions sur Commande :
CREATE OR REPLACE TRIGGER trg_AuditCommande
AFTER INSERT OR DELETE OR UPDATE ON Commande
FOR EACH ROW
DECLARE
v_action VARCHAR2(3);
v_actCol VARCHAR2(200);
BEGIN
-- Déterminer l'action réalisée (INS, DEL, UPD)
IF INSERTING THEN
v_action := 'INS';
ELSIF DELETING THEN
v_action := 'DEL';
ELSIF UPDATING THEN
v_action := 'UPD';
-- Vérifier quelles colonnes ont été modifiées
v_actCol := '';
IF UPDATING('client_id') THEN v_actCol := v_actCol || 'client_id, '; END IF;
IF UPDATING('date_achat') THEN v_actCol := v_actCol || 'date_achat, '; END IF;
IF UPDATING('reference') THEN v_actCol := v_actCol || 'reference, '; END IF;
-- Supprimer la dernière virgule et espace
v_actCol := RTRIM(v_actCol, ', ');
END IF;
-- Insérer les informations dans la table daudit
INSERT INTO CommandeAuditLog (Utilisateur, ActionSQL, DateMAJ, ActCol)
VALUES (USER, v_action, SYSDATE, v_actCol);
END;
/
✅ Avantage : Permet davoir un suivi des modifications sur la table Commande.
Résumé des solutions implémentées :
1. Trigger trg_DeleteCommande → Supprime les lignes de commande avant la suppression d'une commande.
2. Trigger trg_DeleteClient → Supprime les commandes et lignes de commande associées à un client.
3. Alternative aux triggers → Utilisation de ON DELETE CASCADE.
4. Historisation des clients → Création de Client_His pour stocker les clients supprimés.
5. Audit des modifications sur Commande → Création de CommandeAuditLog avec un trigger trg_AuditCommande.