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, l'exemple de schéma hr doit être installé et vous devez être connecté à la base de données 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 du langage PL/SQL d'Oracle AI Database 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 : Référence du langage PL/SQL d'Oracle AI Database 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.

Pour créer le déclencheur NEW_EVALUATION, procédez comme suit :

  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, cliquez sur Nouveau déclencheur.

  4. Dans la fenêtre Create Trigger :

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

    2. Pour 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 cliquez sur >.)

    4. Désélectionnez l'option Statement Level.

    5. Cliquez ensuite sur 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 ce qui suit :

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

    La base de données 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.

Pour créer HR_USERS_LOG, HR_LOGON_TRIGGER et HR_LOGOFF_TRIGGER, procédez comme suit :

  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 : Référence du langage PL/SQL d'Oracle AI Database pour plus d'informations sur les déclencheurs système