Cours SQL ORACLE – 14 : TRIGGERS
Un trigger (ou déclencheur) est un bloc PL/SQL exécuté automatiquement par Oracle en réponse à un événement sur une table ou une vue.
Ces événements sont généralement :
- une insertion (INSERT),
- une mise à jour (UPDATE),
- une suppression (DELETE).
Les triggers permettent d’automatiser certaines actions comme :
- la validation de données,
- la journalisation (audit),
- la synchronisation entre tables, etc.
Types de triggers
Selon le moment du déclenchement
- BEFORE : s’exécute avant l’instruction DML (utile pour valider ou modifier les données avant insertion/mise à jour).
- AFTER : s’exécute après l’instruction DML (utile pour journaliser ou propager les changements)
Selon le niveau d’action
- FOR EACH ROW : le trigger s’exécute pour chaque ligne affectée.
- Statement-level (sans FOR EACH ROW) : s’exécute une seule fois par instruction SQL.
Syntaxe générale
CREATE [OR REPLACE] TRIGGER nom_trigger
{BEFORE | AFTER} {INSERT | UPDATE | DELETE}
ON nom_table
[FOR EACH ROW]
BEGIN
-- Code PL/SQL exécuté automatiquement
END;
/
Exemples pratiques
- Exemple 1 — Audit des insertions
Créer un trigger qui garde la trace des insertions dans une table EMPLOYES.
CREATE TABLE EMP_AUDIT (
user_name VARCHAR2(30),
action_date DATE,
emp_id NUMBER,
action_type VARCHAR2(10)
);
CREATE OR REPLACE TRIGGER trg_emp_audit
AFTER INSERT ON EMPLOYES
FOR EACH ROW
BEGIN
INSERT INTO EMP_AUDIT (user_name, action_date, emp_id, action_type)
VALUES (USER, SYSDATE, :NEW.id, 'INSERT');
END;
/
Explication :
:NEW représente les nouvelles valeurs insérées.
USER retourne le nom de l’utilisateur connecté.
Le trigger s’exécute après chaque insertion sur EMPLOYES.
- Exemple 2 — Validation avant insertion
Empêcher d’insérer un salaire négatif dans la table EMPLOYES.
CREATE OR REPLACE TRIGGER trg_check_salary
BEFORE INSERT OR UPDATE ON EMPLOYES
FOR EACH ROW
BEGIN
IF :NEW.salaire < 0 THEN
RAISE_APPLICATION_ERROR(-20001, 'Le salaire ne peut pas être négatif.');
END IF;
END;
/
Explication :
BEFORE permet d’intercepter la donnée avant qu’elle soit enregistrée. RAISE_APPLICATION_ERROR génère une erreur personnalisée.
- Exemple 3 — Journalisation des suppressions Conserver une trace des lignes supprimées.
CREATE TABLE EMP_DELETE_LOG AS SELECT * FROM EMPLOYES WHERE 1=0;
CREATE OR REPLACE TRIGGER trg_log_delete AFTER DELETE ON EMPLOYES FOR EACH ROW
BEGIN
INSERT INTO EMP_DELETE_LOG VALUES (:OLD.id, :OLD.nom, :OLD.salaire, SYSDATE);
END;
/
Explication :
:OLD contient les anciennes valeurs avant suppression.
Ce trigger garde un historique des employés supprimés.
