Trigger Oracle SQL : Guide complet pour débutants

Apprenez à créer et utiliser un trigger Oracle SQL : définition, syntaxe complète, exemples pratiques et erreurs courantes à éviter. Guide expert 2024.

Illustration du tutoriel SQL Oracle : Trigger Oracle SQL : Guide complet pour débutants

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.

Publicité

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, UPDATE ou DELETE.
  • 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ètreDescription
OR REPLACERecrée le trigger s’il existe déjà, sans erreur.
BEFORE / AFTERDéfinit si le trigger s’exécute avant ou après l’événement DML.
INSTEAD OFRemplace l’action DML (uniquement sur les vues).
FOR EACH ROWTrigger 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 :NEWPseudoenregistrements 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.
Publicité

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éclenchementAutomatique sur événement DML, DDL ou système
Types principauxBEFORE, 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équenteORA-04091 : table en mutation
DésactivationALTER TRIGGER nom_trigger DISABLE;
RéactivationALTER TRIGGER nom_trigger ENABLE;

2 bonnes pratiques Oracle indispensables

  1. 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.
  2. 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 OF permettent de rendre des vues complexes modifiables.
Publicité

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Publicité