🔹Un Trigger en PL/SQL
Un trigger (ou déclencheur) est un bloc de code PL/SQL stocké dans la base de
données qui s’exécute automatiquement lorsqu’un événement spécifique survient sur une
table ou une vue.
Ces événements sont généralement :
● INSERT
● UPDATE
● DELETE
On utilise les triggers pour :
● Automatiser des contrôles métiers
● Maintenir des historiques
● Appliquer des règles d’intégrité personnalisées
🔹 Syntaxe générale
CREATE [OR REPLACE] TRIGGER nom_trigger
{BEFORE | AFTER | INSTEAD OF}
{INSERT | UPDATE | DELETE}
ON nom_table
[FOR EACH ROW]
[WHEN (condition)]
DECLARE
-- Déclarations locales
BEGIN
-- Instructions PL/SQL
END;
🔹 1. BEFORE (Avant)
Le trigger s’exécute avant que l’opération (INSERT, UPDATE ou DELETE) soit effectuée.
Utilisation typique :
● Valider ou modifier les données avant qu'elles soient insérées ou modifiées.
● Empêcher une opération avec RAISE_APPLICATION_ERROR.
Exemple :
CREATE OR REPLACE TRIGGER trg_verifier_salaire
BEFORE INSERT ON employes
FOR EACH ROW
BEGIN
IF :[Link] < 0 THEN
RAISE_APPLICATION_ERROR(-20002, 'Salaire invalide');
END IF;
END;
🔹 2. AFTER (Après)
Le trigger s’exécute après que l’opération a eu lieu avec succès.
Utilisation typique :
● Enregistrer l’opération dans une table de log.
● Notifier, archiver, déclencher des actions secondaires.
Exemple :
CREATE OR REPLACE TRIGGER trg_log_suppression
AFTER DELETE ON employes
FOR EACH ROW
BEGIN
INSERT INTO log_suppression (id_emp, date_suppression)
VALUES (:OLD.id_emp, SYSDATE);
END;
📌 Ici, on enregistre la suppression après qu'elle ait été faite.
🔹 3. INSTEAD OF (À la place de)
Le trigger s’exécute à la place de l’opération. Il est utilisé uniquement avec les vues, car
on ne peut pas directement modifier certaines vues complexes (jointures, agrégats...).
Utilisation typique :
● Permettre les opérations DML (INSERT, UPDATE, DELETE) sur des vues non
modifiables.
Exemple :
Supposons une vue basée sur plusieurs tables :
CREATE VIEW vue_employes_postes AS
SELECT e.id_emp, [Link], p.nom_poste
FROM employes e
JOIN postes p ON e.id_poste = p.id_poste;
Cette vue ne peut pas être modifiée directement. On utilise donc un INSTEAD OF INSERT :
CREATE OR REPLACE TRIGGER trg_vue_employes_insert
INSTEAD OF INSERT ON vue_employes_postes
FOR EACH ROW
BEGIN
INSERT INTO employes (id_emp, nom, id_poste)
VALUES (:NEW.id_emp, :[Link],
(SELECT id_poste FROM postes WHERE nom_poste = :NEW.nom_poste));
END;
🔹 Exemple 1 : Trigger "AFTER INSERT"
Contexte : On veut enregistrer chaque insertion dans la table employes dans une table
d'historique log_employes.
Création des tables :
CREATE TABLE employes (
id_emp NUMBER PRIMARY KEY,
nom VARCHAR2(50),
poste VARCHAR2(50)
);
CREATE TABLE log_employes (
id_log NUMBER PRIMARY KEY,
id_emp NUMBER,
action VARCHAR2(20),
date_action DATE
);
Trigger :
CREATE OR REPLACE TRIGGER trg_log_insert_employe
AFTER INSERT ON employes
FOR EACH ROW
BEGIN
INSERT INTO log_employes (id_log, id_emp, action, date_action)
VALUES (log_employes_seq.NEXTVAL, :NEW.id_emp, 'INSERT', SYSDATE);
END;
Explication :
● :NEW.id_emp : fait référence à la valeur insérée
● Ce trigger s’exécute après chaque insertion sur la table employes
● Il ajoute une ligne dans log_employes
🔹 Exemple 2 : Trigger "BEFORE UPDATE"
Contexte : Empêcher une baisse de salaire d’un employé.
CREATE OR REPLACE TRIGGER trg_prevent_salaire_baisse
BEFORE UPDATE ON employes
FOR EACH ROW
BEGIN
IF :[Link] < :[Link] THEN
RAISE_APPLICATION_ERROR(-20001, 'Interdiction de baisser le salaire');
END IF;
END;
Explication :
● :NEW correspond à la nouvelle valeur
● :OLD correspond à l’ancienne valeur
● Si le nouveau salaire est inférieur à l’ancien, l’opération est annulée.
🔹 Exemple 3 : Trigger "AFTER DELETE"
Contexte : Sauvegarder les employés supprimés dans une table d’archives.
CREATE TABLE archive_employes AS SELECT * FROM employes WHERE 1=0;
CREATE OR REPLACE TRIGGER trg_archive_employe
AFTER DELETE ON employes
FOR EACH ROW
BEGIN
INSERT INTO archive_employes (id_emp, nom, poste)
VALUES (:OLD.id_emp, :[Link], :[Link]);
END;
Explication :
● Ce trigger copie la ligne supprimée dans une table d’archive.