Création de déclencheurs

Pour créer les déclencheurs, utilisez l'interface graphique de SQL Developer ou l'instruction DDL CREATE TRIGGER.

Cette section explique comment créer des déclencheurs à l'aide des deux méthodes suivantes.

Par défaut, un déclencheur est activé lors de sa création. Pour créer un déclencheur désactivé, utilisez l'instruction CREATE TRIGGER avec la clause DISABLE.

Remarque : vous devez disposer des privilèges appropriés pour la création de déclencheurs. Cette information supplémentaire est toutefois inutile pour cette discussion.

Remarque : pour effectuer les tutoriels de ce document, vous devez être connecté à Oracle Database en tant qu'utilisateur HR de SQL Developer.

Voir aussi :

A propos des pseudo-enregistrements OLD et NEW

Lors de l'exécution d'un déclencheur d'un niveau ligne, le système d'exécution PL/SQL crée et remplit les deux pseudo-enregistrements OLD et NEW. Ils portent le nom de pseudo-enregistrements car ils présentent certaines propriétés des enregistrements, mais pas toutes.

Pour la ligne en cours de traitement par le déclencheur :

Pour référencer un pseudo-enregistrement, placez le signe deux-points avant son nom :OLD ou :NEW-comme dans l'Example 6-1.

Voir aussi : Référence de langage Oracle Database PL/SQL pour plus d'informations sur les pseudo-cordons anciens et nouveaux.

Tutoriel : Création d'un déclencheur journalisant les modifications apportées à la table

Ce tutoriel présente l'utilisation de l'instruction CREATE TRIGGER pour créer un déclencheur nommé EVAL_CHANGE_TRIGGER, qui ajoute une ligne à la table EVALUATIONS_LOG dès lors qu'une instruction INSERT, UPDATE ou DELETE modifie la table EVALUATIONS.

Le déclencheur ajoute la ligne après l'exécution de l'instruction de déclenchement, et utilise les prédicats conditionnels INSERTING, UPDATING et DELETING pour déterminer laquelle des trois instructions DML possibles a déclenché son utilisation.

EVAL_CHANGE_TRIGGER est un déclencheur de niveau d'instruction et un déclencheur APTER.

Pour créer EVALUATIONS_LOG et EVAL_CHANGE_TRIGGER, procédez comme suit :

  1. Créez la table EVALUATIONS_LOG :

     CREATE TABLE EVALUATIONS_LOG ( log_date DATE
                                 , action VARCHAR2(50));
    
  2. Créer EVAL_CHANGE_TRIGGER :

     CREATE OR REPLACE TRIGGER EVAL_CHANGE_TRIGGER
    
       AFTER INSERT OR UPDATE OR DELETE
       ON EVALUATIONS
     DECLARE
       log_action  EVALUATIONS_LOG.action%TYPE;
     BEGIN
       IF INSERTING THEN
         log_action := 'Insert';
       ELSIF UPDATING THEN
         log_action := 'Update';
       ELSIF DELETING THEN
         log_action := 'Delete';
       ELSE
         DBMS_OUTPUT.PUT_LINE('This code is not reachable.');
       END IF;
    
       INSERT INTO EVALUATIONS_LOG (log_date, action)
         VALUES (SYSDATE, log_action);
     END;
    

Voir aussi : Oracle Database PL/SQL Language Reference, pour plus d'informations sur les prédicats conditionnels.

Tutoriel : Création d'un déclencheur générant une clé primaire pour une ligne avant son insertion

This tutorial shows how to use the SQL Developer Create Trigger tool to create a trigger that fires before a row is inserted into the EVALUATIONS table, and generates the unique number for the primary key of that row, using EVALUATIONS_SEQUENCE.

La séquence EVALUATIONS_SEQUENCE (créée dans "Tutoriel : Création d'une séquence") génère des clés primaires pour la table EVALUATIONS (créée dans). Toutefois, ces clés primaires ne sont pas insérées automatiquement dans la table.

This tutorial shows how to use the SQL Developer Create Trigger tool to create a trigger named NEW_EVALUATION_TRIGGER, which fires before a row is inserted into the EVALUATIONS table, and generates the unique number for the primary key of that row, using EVALUATIONS_SEQUENCE. Le déclencheur est exécuté une fois pour chaque ligne concernée par l'instruction INSERT de déclenchement.

NEW_EVALUATION_TRIGGER est un déclencheur de niveau de ligne et un déclencheur BEFORE.

Etapes de création du déclencheur NEW_EVALUATION :

  1. Dans le cadre Connexions, développez hr_conn.

  2. Dans la liste des types d'objet schéma, cliquez avec le bouton droit de la souris sur Déclencheurs.

  3. Dans la liste des choix, sélectionnez Nouveau déclencheur.

  4. Dans la fenêtre Create Trigger :

    1. Dans le champ Nom, remplacez la valeur par défaut par NEW_EVALUATION_TRIGGER par TRIGGER1.

    2. Pour l'objet de base, sélectionnez EVALUATIONS dans le menu.

    3. Déplacez INSERT des événements disponibles vers les événements sélectionnés.

      (Sélectionnez INSERT et >.)

    4. Désélectionnez l'option Niveau d'instruction.

    5. Sélectionnez OK.

      Le panneau NEW_EVALUATION_TRIGGER apparaît et affiche l'instruction CREATE TRIGGER ayant créé le déclencheur :

       CREATE OR REPLACE
      
       TRIGGER NEW_EVALUATION_TRIGGER
      
       BEFORE INSERT ON EVALUATIONS
      
       FOR EACH ROW
      
       BEGIN
      
         NULL;
      
       END;
      

      Le titre du panneau NEW_EVALUATION_TRIGGER apparaît en italique, afin d'indiquer que le déclencheur n'est pas encore enregistré dans la base de données.

  5. Dans l'instruction CREATE TRIGGER, remplacez NULL par le texte suivant :

     :NEW.evaluation_id := evaluations_sequence.NEXTVAL
    
  6. Dans le menu Fichier, sélectionnez Enregistrer.

    Oracle Database compile et enregistre la procédure. Le titre du panneau NEW_EVALUATION_TRIGGER n'apparaît plus en italique.

Création d'un déclencheur INSTEAD OF

Les vues présentent le résultat des requêtes sous forme de table. Pour modifier une vue de la même façon qu'une table, vous devez créer les déclencheurs INSTEAD OF. La modification ne porte pas sur la vue mais sur les tables sous-jacentes.

Par exemple, considérons la vue EMP_LOCATIONS, dont la colonne NAME est créée à partir des colonnes LAST_NAME et FIRST_NAME de la table EMPLOYEES :

CREATE VIEW EMP_LOCATIONS AS
SELECT e.EMPLOYEE_ID,
  e.LAST_NAME || ', ' || e.FIRST_NAME NAME,
  d.DEPARTMENT_NAME DEPARTMENT,
  l.CITY CITY,
  c.COUNTRY_NAME COUNTRY
FROM EMPLOYEES e, DEPARTMENTS d, LOCATIONS l, COUNTRIES c
WHERE e.DEPARTMENT_ID = d.DEPARTMENT_ID AND
 d.LOCATION_ID = l.LOCATION_ID AND
 l.COUNTRY_ID = c.COUNTRY_ID
ORDER BY LAST_NAME;

Pour mettre à jour la vue EMP_LOCATIONS.NAME (créée dans la section "Création de vues avec l'instruction CREATE VIEW"), vous devez mettre à jour EMPLOYEES.LAST_NAME et EMPLOYEES.FIRST_NAME. C'est ce que fait le déclencheur INSTEAD OF de l'Example 6-1.

NEW et OLD sont despseudo-enregistrements créés et remplis par le moteur d'exécution PL/SQL à chaque utilisation d'un déclencheur d'un niveau ligne. OLD et NEW stockent respectivement les valeurs d'origine et les nouvelles valeurs de l'enregistrement en cours du traitement par le déclencheur. Ils portent le nom de pseudo-enregistrements car ils présentent certaines propriétés des enregistrements, mais pas toutes.

Exemple 6-1 Création d'un déclencheur INSTEAD OF

CREATE OR REPLACE TRIGGER update_name_view_trigger
INSTEAD OF UPDATE ON emp_locations
BEGIN
  UPDATE employees SET
    first_name = substr( :NEW.name, instr( :new.name, ',' )+2),
    last_name = substr( :NEW.name, 1, instr( :new.name, ',')-1)
  WHERE employee_id = :OLD.employee_id;
END;

Voir aussi :

Tutoriel : Création de déclencheurs journalisant des événements LOGON et LOGOFF

Ce tutoriel présente l'utilisation de l'instruction CREATE TRIGGER pour créer deux déclencheurs, HR_LOGON_TRIGGER et HR_LOGOFF_TRIGGER. Après la connexion d'une personne en tant qu'utilisateur HR, HR_LOGON_TRIGGER ajoute une ligne à la table HR_USERS_LOG. Avant la déconnexion d'un utilisateur en tant qu'utilisateur HR, HR_LOGOFF_TRIGGER ajoute une ligne à la table HR_USERS_LOG.

HR_LOGON_TRIGGER et HR_LOGOFF_TRIGGER sont des déclencheurs système, HR_LOGON_TRIGGER est un déclencheur ATER et HR_LOGOFF_TRIGGER est un déclencheur BEFORE.

Etapes de création de HR_USERS_LOG, HR_LOGON_TRIGGER et HR_LOGOFF_TRIGGER :

  1. Créez la table HR_USERS_LOG :

     CREATE TABLE hr_users_log (
       user_name VARCHAR2(30),
       activity VARCHAR2(20),
       event_date DATE
     );
    
  2. Créer HR_LOGON_TRIGGER :

     CREATE OR REPLACE TRIGGER hr_logon_trigger
    
       AFTER LOGON
    
       ON HR.SCHEMA
     BEGIN
       INSERT INTO hr_users_log (user_name, activity, event_date)
       VALUES (USER, 'LOGON', SYSDATE);
     END;
    
  3. Créer HR_LOGOFF_TRIGGER :

     CREATE OR REPLACE TRIGGER hr_logoff_trigger
    
       BEFORE LOGOFF
    
       ON HR.SCHEMA
     BEGIN
       INSERT INTO hr_users_log (user_name, activity, event_date)
       VALUES (USER, 'LOGOFF', SYSDATE);
     END;
    

Voir aussi : Oracle Database PL/SQL Language Reference, pour plus d'informations sur les déclencheurs système.