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;