
Trigger Oracle SQL : Guide complet avec exemples pratiques
Le trigger Oracle SQL est l’un des objets les plus puissants de la base de données Oracle. Il permet d’automatiser des actions en réponse à des événements précis, sans intervention manuelle. Dans un contexte d’entreprise, maîtriser le trigger Oracle est indispensable pour garantir l’intégrité des données, journaliser les modifications et implémenter des règles métier complexes directement au niveau de la base de données.
Définition et utilisation d’un trigger Oracle SQL
Un trigger (ou déclencheur) est un bloc PL/SQL qui s’exécute automatiquement en réponse à un événement particulier survenant sur une table, une vue, un schéma ou la base de données elle-même. Contrairement à une procédure stockée que l’on appelle explicitement, un trigger se déclenche de façon transparente, sans aucune intervention du développeur ou de l’utilisateur final.
Cas d’usage en entreprise
Les triggers Oracle sont utilisés dans de nombreux contextes professionnels :
- Audit et traçabilité : enregistrer automatiquement dans une table de log chaque INSERT, UPDATE ou DELETE effectué sur une table sensible (données financières, RH, clients).
- Intégrité référentielle avancée : implémenter des contraintes complexes que les clés étrangères classiques ne peuvent pas gérer.
- Calcul automatique de valeurs : alimenter des colonnes calculées (par exemple, une date de mise à jour systématique).
- Synchronisation de tables : répliquer des données entre plusieurs tables lors d’une modification.
- Contrôle des accès horaires : interdire toute modification en dehors des heures ouvrées.
Il existe trois grandes familles de triggers Oracle :
- DML Triggers : déclenchés par des ordres
INSERT,UPDATEouDELETE. - DDL Triggers : déclenchés par des ordres
CREATE,ALTER,DROP. - System/Database Triggers : déclenchés par des événements système comme
LOGON,LOGOFF,STARTUP.
Syntaxe complète d’un trigger Oracle SQL
Voici la syntaxe générale d’un trigger DML, le type le plus couramment utilisé :
CREATE [OR REPLACE] TRIGGER nom_trigger
{BEFORE | AFTER | INSTEAD OF}
{INSERT | UPDATE [OF colonne] | DELETE}
[OR {INSERT | UPDATE | DELETE}]
ON nom_table
[REFERENCING OLD AS ancien NEW AS nouveau]
[FOR EACH ROW]
[WHEN (condition)]
DECLARE
-- déclarations de variables (optionnel)
BEGIN
-- corps du trigger (obligatoire)
EXCEPTION
-- gestion des erreurs (optionnel)
END nom_trigger;
/Explication des paramètres essentiels
| Paramètre | Description |
|---|---|
OR REPLACE | Recrée le trigger s’il existe déjà, sans erreur. |
BEFORE / AFTER | Définit si le trigger s’exécute avant ou après l’événement DML. |
INSTEAD OF | Remplace l’action DML (uniquement sur les vues). |
FOR EACH ROW | Trigger de ligne : s’exécute pour chaque ligne affectée. Sans cette clause, c’est un trigger d’instruction (une seule exécution). |
:OLD et :NEW | Pseudoenregistrements donnant accès aux valeurs avant (:OLD) et après (:NEW) la modification. |
WHEN (condition) | Filtre optionnel pour restreindre l’exécution du trigger à certaines lignes. |
Exemples pratiques de triggers Oracle SQL
Exemple 1 – Audit automatique des modifications de salaires
Contexte métier : Dans une entreprise, toute modification du salaire d’un employé doit être tracée dans une table d’audit pour conformité légale (RGPD, audit interne).
-- Création de la table d'audit
CREATE TABLE audit_salaires (
id_audit NUMBER GENERATED ALWAYS AS IDENTITY,
id_employe NUMBER,
ancien_salaire NUMBER(10,2),
nouveau_salaire NUMBER(10,2),
modifie_par VARCHAR2(50),
date_modif DATE
);
-- Création du trigger AFTER UPDATE sur la table EMPLOYES
CREATE OR REPLACE TRIGGER trg_audit_salaire
AFTER UPDATE OF salaire
ON employes
FOR EACH ROW
WHEN (OLD.salaire != NEW.salaire) -- déclenché uniquement si le salaire change
BEGIN
INSERT INTO audit_salaires (
id_employe,
ancien_salaire,
nouveau_salaire,
modifie_par,
date_modif
) VALUES (
:OLD.id_employe,
:OLD.salaire, -- valeur avant la mise à jour
:NEW.salaire, -- nouvelle valeur après la mise à jour
USER, -- fonction Oracle retournant l'utilisateur connecté
SYSDATE -- date et heure système Oracle
);
END trg_audit_salaire;
/Ce trigger se déclenche après chaque mise à jour du champ salaire. Il insère automatiquement une ligne dans audit_salaires avec l’ancien salaire, le nouveau salaire, l’identifiant de l’utilisateur Oracle et la date de modification.
Exemple 2 – Contrôle des modifications en dehors des heures ouvrées
Contexte métier : Une banque souhaite interdire toute insertion ou suppression dans la table transactions en dehors des heures d’ouverture (8h-18h, du lundi au vendredi).
-- Trigger BEFORE INSERT OR DELETE sur la table TRANSACTIONS
CREATE OR REPLACE TRIGGER trg_controle_horaires
BEFORE INSERT OR DELETE
ON transactions
DECLARE
v_heure NUMBER;
v_jour NUMBER;
BEGIN
-- Extraction de l'heure courante (format 24h)
v_heure := TO_NUMBER(TO_CHAR(SYSDATE, 'HH24'));
-- Extraction du jour de la semaine (1=Dimanche, 7=Samedi en Oracle)
v_jour := TO_NUMBER(TO_CHAR(SYSDATE, 'D'));
-- Vérification : hors plage horaire ou week-end
IF v_heure < 8 OR v_heure >= 18 OR v_jour = 1 OR v_jour = 7 THEN
RAISE_APPLICATION_ERROR(
-20001,
'Opération interdite : les modifications ne sont autorisées que du lundi au vendredi de 8h à 18h.'
);
END IF;
END trg_controle_horaires;
/Ce trigger est de type instruction (sans FOR EACH ROW). Il s’exécute une seule fois par ordre SQL. La procédure RAISE_APPLICATION_ERROR est la méthode Oracle standard pour lever une erreur métier personnalisée et annuler l’opération en cours.
Erreurs courantes avec les triggers Oracle SQL
Erreur : ORA-04091 – Table en mutation (Mutating Table)
Description : L’erreur ORA-04091: table [nom] is mutating survient lorsqu’un trigger de ligne (FOR EACH ROW) tente de lire ou de modifier la table sur laquelle il est lui-même défini. Oracle interdit cette opération pour éviter des boucles infinies et des incohérences.
Exemple problématique :
-- ❌ INCORRECT : lecture de la table EMPLOYES depuis un trigger sur EMPLOYES
CREATE OR REPLACE TRIGGER trg_mauvais
AFTER INSERT ON employes
FOR EACH ROW
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM employes; -- ORA-04091 !
END;
/Solution recommandée : Utiliser un trigger d’instruction (sans FOR EACH ROW) pour les opérations nécessitant une lecture globale de la table, ou recourir au pattern compound trigger (disponible depuis Oracle 11g) qui permet de combiner plusieurs temporalités dans un seul trigger en évitant la mutation.
Résumé – Les points clés du trigger Oracle SQL
| Point clé | Détail |
|---|---|
| Déclenchement | Automatique sur événement DML, DDL ou système |
| Types principaux | BEFORE, AFTER, INSTEAD OF |
| Granularité | Par ligne (FOR EACH ROW) ou par instruction |
| Pseudoenregistrements | :OLD (avant) et :NEW (après) — uniquement FOR EACH ROW |
| Erreur fréquente | ORA-04091 : table en mutation |
| Désactivation | ALTER TRIGGER nom_trigger DISABLE; |
| Réactivation | ALTER TRIGGER nom_trigger ENABLE; |
2 bonnes pratiques Oracle indispensables
- Nommez vos triggers de façon explicite : adoptez une convention de nommage claire, par exemple
trg_[action]_[table](ex.trg_audit_employes). Cela facilite la maintenance et le débogage dans les grands schémas Oracle. - Gardez la logique du trigger légère : un trigger ne doit pas contenir des traitements lourds ou des appels à des procédures complexes. Si la logique est volumineuse, externalisez-la dans un package PL/SQL et appelez-le depuis le trigger. Cela améliore les performances et la lisibilité du code.
Aller plus loin avec Oracle SQL
Pour approfondir vos connaissances sur les objets Oracle proches des triggers, nous vous recommandons ces trois sujets complémentaires :
- Package PL/SQL Oracle : apprenez à regrouper vos procédures et fonctions dans des packages réutilisables, idéaux pour externaliser la logique métier appelée depuis vos triggers.
- Procédure stockée Oracle SQL : découvrez comment créer des procédures PL/SQL réutilisables pour structurer votre code et l’appeler depuis vos triggers ou vos applications.
- Vue Oracle SQL : maîtrisez les vues Oracle et comprenez comment les triggers
INSTEAD OFpermettent de rendre des vues complexes modifiables.
