Aller au contenu

Introduction aux triggers de table

Un trigger (déclencheur) est un bloc PL/SQL stocké dans la base de données qui s’exécute automatiquement lorsqu’un événement survient sur une table.

✏ Contrairement aux fonctions et procédures, le trigger n'est JAMAIS appelé manuellement, c'est un automatisme.

Ce qui déclenche un trigger est une instruction du DML sur une table : INSERT, UPDATE ou DELETE.

✔ Les triggers offrent une solution procédurale pour définir des contraintes complexes ou qui prennent en compte des données issues de plusieurs lignes ou de plusieurs tables. Par exemple, pour garantir qu'un client ne peut pas avoir plus de 2 commandes non payées.

❌ Les triggers ne remplacent pas les contraintes d'intégrité, car ils remandent plus de ressources et sont généralement plus lents.

Syntaxe générale

CREATE OR REPLACE TRIGGER nom_trigger
BEFORE ou AFTER INSERT ou UPDATE ou DELETE
ON nom_table
DECLARE
    --variables
BEGIN
    -- Instructions PL/SQL
END;
/

Ceci est la syntaxe générale pour un trigger de table.

Niveau de trigger

Il existe deux niveau de trigger :

  • Trigger de table : s'exécute une seule fois avant ou après l'instruction déclencheuse
  • Trigger de rangée : s'exécute une fois PAR LIGNE touchée par l'instruction déclencheuse

Comparaison :

Critère 🔷 Trigger de table /instruction (statement-level) 🔶 Trigger de rangée (row-level)
🔹 Moment d’exécution Une seule fois par instruction SQL Une fois par ligne affectée
🔹 Niveau d’exécution Sur l’ensemble de la table Sur chaque enregistrement
🔹 Accès aux lignes modifiées ❌ Aucun accès aux lignes individuelles ✅ Accès à chaque ligne
🔹 Table en mutation (table associée au trigger) ✅ Peut être interrogée avec un SELECT ❌ Seule la ligne en modification est accessible
🔹 Accès ligne par ligne Avec un curseur avant ou après la modification Pendant la modification, accès à :OLD et :NEW
🔹 Usage principal Audit global, logs, règles générales Validation et contrôle des données ligne par ligne
🔹 Performance Plus rapide (une seule exécution) Plus coûteux (boucle implicite sur les lignes)

Trigger de table

Un trigger de table s’exécute une seule fois par instruction SQL, peu importe le nombre de lignes affectées.

Par exemple :

Lors de l'instruction

UPDATE Client SET ville = 'Québec';

Le trigger s'exécute une fois avant ou après la mise à jour.

Il ne sait donc pas quelles lignes spécifiques sont affectées par la modification.

Le trigger de table est donc utilisé généralement pour des logs, des traces (audit) ou appliquer des règles générales sur la table (ex. : maximum de 2 factures avec solde par client).

Exemple :

Objectif : conserver un historique des actions effectuées sur une table.

Table d'historique :

CREATE TABLE Audit_Client (
    action VARCHAR2(50),
    dateAction DATE
);

Trigger qui s'exécute après la mise à jour de la table :

CREATE OR REPLACE TRIGGER trg_historiqueClient
AFTER UPDATE ON Client
BEGIN
    INSERT INTO Audit_Client(action, date_action)
    VALUES ('Mise à jour effectuée sur Client', SYSDATE);
END;
/

Cas d'utilisation des triggers de table

Les triggers de table sont utilisés pour :

  • ✔ Audit global

    Traçabilité des modifications

  • ✔ Journalisation

    Enregistrer qu’une action a eu lieu

  • ✔ Contraintes métier simples

    Bloquer certaines opérations qui ne correspondent pas au règles internes de l'entreprise

  • ✔ Notifications

    Déclencher un message ou une action globale

Gestion des erreurs

Un trigger peut contenir une section EXCEPTION comme un bloc PL/SQL classique.

Toutefois, l'exception reste au niveau de l'exécution du trigger.

Exemple :

CREATE OR REPLACE TRIGGER trg_update_client
AFTER UPDATE ON Client
BEGIN
    INSERT INTO Audit_Client(action, date_action)
    VALUES ('UPDATE Client', SYSDATE);

EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('Erreur dans le trigger d''audit.');
END;
/

⚠️ Ce trigger est déclenché après la mise à jour de la table client. Donc, si l'exception est levée, un message sera envoyé dans le buffer d'Oracle, mais ne remontera par plus haut. De plus, la mise à jour aura eu lieu malgré cela.

✔ Pour qu'une erreur soit traitée, qu'elle annule la modification et remonte de un niveau d'exécution pour être affichée, on doit alors utiliser RAISE_APPLICATION_ERROR.

Exemple :

Le trigger suivant s'exécute après suppression dans la table Client.

Si la table ne contient plus d'employé ayant le titre "Président", alors on lève une erreur qui annule tout.

CREATE OR REPLACE TRIGGER trg_deleteClient
AFTER DELETE ON Client
DECLARE
    nbrePresident NUMBER(1) := 0;

    no_president EXCEPTION;
BEGIN

    SELECT count(noEmploye) INTO nbrePresident 
    FROM Employes
    WHERE titre = 'Président';

    if nbrePresident = 0 THEN
        RAISE no_president;
    END IF;

EXCEPTION
    WHEN no_president THEN
        RAISE_APPLICATION_ERROR(-20010, 'Suppression du président non autorisé.');
END;
/