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;
/