Les Déclencheurs Oracle: Guide Pratique

Les déclencheurs (triggers) en Oracle sont des procédures stockées autoamtiquement exécutées par la base de données en réponse à des événements spécifiques sur certaines tables ou vues.

Déclencheurs d'Instruction

Créons d'abord deux tables : ouvrage et categorie_ouvrage. La table ouvrage contient une clé étrangère id_categorie référençant l'identifiant de categorie_ouvrage.

Exemple 1 : Contrôle d'accès

Besoin : Empêcher les utilisateurs autres que 'admin' de modifier la table ouvrage en affichant un message d'erreur 'Accès non autorisé'.


CREATE OR REPLACE trigger controle_acces_livre
BEFORE INSERT OR UPDATE OR DELETE
ON ouvrage
BEGIN
   IF USER != 'ADMIN' THEN
      RAISE_APPLICATION_ERROR(-20001, USER || ' - Accès non autorisé');
   END IF;
END;
/

-- Si les permissions de création de déclencheur manquent, connectez en tant que sysdba :
GRANT CREATE TRIGGER TO utilisateur;

En tant qu'utilisateur 'utilisateur', l'insertion de données dans ouvrage génère une erreur :


INSERT INTO ouvrage VALUES(5, 'Nouveau livre', 1);
INSERT INTO ouvrage VALUES(5, 'Nouveau livre', 1)
*
ERREUR à la ligne 1 :
ORA-20001: UTILISATEUR - Accès non autorisé
ORA-06512: dans "UTILISATEUR.CONTROLE_ACCES_LIVRE", ligne 3
ORA-04088: erreur lors de l'exécution du déclencheur 'UTILISATEUR.CONTROLE_ACCES_LIVRE'

Exemple 2 : Journalisation des opérations

Enregistrons toutes les opérations d'insertion, de mise à jour et de suppression sur la table ouvrage dans une table journal_ouvrages.


CREATE OR REPLACE trigger journaliser_operations
AFTER INSERT OR UPDATE OR DELETE
ON ouvrage
BEGIN
   IF UPDATING THEN
      INSERT INTO journal_ouvrages VALUES(USER, 'modification', SYSDATE);
   ELSIF INSERTING THEN
      INSERT INTO journal_ouvrages VALUES(USER, 'ajout', SYSDATE);
   ELSIF DELETING THEN
      INSERT INTO journal_ouvrages VALUES(USER, 'suppression', SYSDATE);
   END IF;
END;
/

-- USER : variable intégrée qui récupère l'utilisateur courant

Déclencheurs de Ligne

Maintenant, utiilsons un déclencheur pour gérer automatiquement le champ quantite de la table categorie_ouvrage. Lorsqu'un ouvrage de catégorie 1 est inséré ou supprimé, le déclancheur met à jour le champ quantite de categorie_ouvrage.


CREATE OR REPLACE trigger incrementer_quantite
AFTER INSERT
ON ouvrage
FOR EACH ROW
BEGIN
   UPDATE categorie_ouvrage 
   SET quantite = quantite + 1 
   WHERE id = :NEW.id_categorie;
END;
/

CREATE OR REPLACE trigger decrementer_quantite
AFTER DELETE
ON ouvrage
FOR EACH ROW
BEGIN
   UPDATE categorie_ouvrage 
   SET quantite = quantite - 1 
   WHERE id = :OLD.id_categorie;
END;
/

-- :NEW     représente la nouvelle ligne (après l'opération)
-- :OLD     représente l'ancienne ligne (avant l'opération)

Ajoutons un enregistrement et vérifions que la quantité est automatiquement mise à jour :


DELETE FROM ouvrage WHERE id = 5;

1 ligne supprimée.

SELECT * FROM categorie_ouvrage;

ID  NOM_CATEGORIE  QUANTITE
---- -------------- --------
1   Informatique   2
2   Sciences       1

Activation et Désactivation des Déclencheurs

La désactivation d'un déclencheur ne le supprime pas, elle le rend simplement inactif. Il peut être réactivé ultérieurement.


-- Désactiver un déclencheur
ALTER TRIGGER controle_acces_livre DISABLE;

-- Activer un déclencheur
ALTER TRIGGER controle_acces_livre ENABLE;

Étiquettes: Oracle PL/SQL déclencheurs base de données triggers

Publié le 7 juillet à 04h36