Création de déclencheurs

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

La présente section explique comment utiliser ces deux méthodes pour créer des déclencheurs.

Par défaut, un déclencheur est créé à l'état Activé. Pour créer un déclencheur à l'état désactivé, utilisez l'instruction CREATE TRIGGER avec la clause DISABLE.

Note : Pour créer des déclencheurs, vous devez disposer des privilèges appropriés. Toutefois, pour cette discussion, vous n'avez pas besoin de ces informations supplémentaires.

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

Voir aussi :

À propos des pseudo-accords anciens et nouveaux

Lorsqu'un déclencheur au niveau ligne se déclenche, le système d'exécution PL/SQL crée et alimente les deux pseudorecords OLD et NEW. Ils sont appelés pseudorecords parce qu'ils ont certaines, mais pas toutes, des propriétés des enregistrements.

Pour l'enregistrement traité par le déclencheur :

Pour référencer un pseudorecord, placez un deux-points avant son nom- :OLD ou :NEW-comme dans Exemple 6-1.

Voir aussi : Informations de référence sur le langage PL/SQL pour Oracle Database pour plus d'informations sur les pseudocordes OLD et NEW.

Tutoriel : Créer un déclencheur qui enregistre les modifications de table

Ce tutoriel explique comment utiliser l'instruction CREATE TRIGGER pour créer un déclencheur, EVAL_CHANGE_TRIGGER, qui ajoute une ligne à la table EVALUATIONS_LOG chaque fois qu'une instruction INSERT, UPDATE ou DELETE modifie la table EVALUATIONS.

Le déclencheur ajoute la rangée après l'énoncé de déclenchement et utilise les prédicats conditionnels INSERTING, UPDATING et DELETING pour déterminer lequel des trois énoncés LMD possibles a déclenché le déclencheur.

EVAL_CHANGE_TRIGGER est un trigger au niveau de l'énoncé et un trigger ATER.

Pour créer EVALUATIONS_LOG et EVAL_CHANGE_TRIGGER :

  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 : Informations de référence sur le langage PL/SQL pour Oracle Database pour plus d'informations sur les prédicats conditionnels

Tutoriel : Créer un déclencheur générant une clé primaire pour une rangée avant son insertion

Ce tutoriel explique comment utiliser l'outil Create Trigger de SQL Developer pour créer un déclencheur qui s'exécute avant l'insertion d'une ligne dans la table EVALUATIONS, et génère le numéro unique de la clé primaire de cette ligne, à l'aide de 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.

Ce tutoriel explique comment utiliser l'outil SQL Developer Create Trigger pour créer un déclencheur nommé NEW_EVALUATION_TRIGGER, qui déclenche avant qu'une ligne soit insérée dans la table EVALUATIONS et génère le numéro unique de la clé primaire de cette ligne, à l'aide de EVALUATIONS_SEQUENCE. Le déclencheur s'exécute une fois pour chaque rangée touchée par l'énoncé INSERT de déclenchement.

NEW_EVALUATION_TRIGGER est un trigger au niveau de la rangée et un trigger AVANT.

Étapes 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 de schéma, cliquez avec le bouton droit de la souris sur Déclencheurs.

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

  4. Dans la fenêtre Create Trigger :

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

    2. Pour Objet de base, sélectionnez ÉVALUATIONS dans le menu.

    3. Déplacez INSÉRER des événements disponibles vers les événements sélectionnés.

      (Sélectionnez INSÉRER et sélectionnez >.)

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

    5. Sélectionnez OK.

      Le volet NEW_EVALUATION_TRIGGER s'ouvre et affiche l'instruction CREATE TRIGGER qui a créé le déclencheur :

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

      Le titre du volet NEW_EVALUATION_TRIGGER est en italique, ce qui indique 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 la procédure et l'enregistre. Le titre du volet NEW_EVALUATION_TRIGGER n'est plus en italique.

Création d'un INSTEAD OF Trigger

Une vue présente la sortie d'une interrogation sous forme de table. Si vous souhaitez modifier une vue comme vous le feriez pour une table, vous devez créer des déclencheurs INSTEAD OF. Au lieu de modifier la vue, ils modifient les tables sous-jacentes.

Prenons l'exemple de 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 "Création de vues à l'aide de l'énoncé CREATE VIEW"), vous devez mettre à jour EMPLOYEES.LAST_NAME et EMPLOYEES.FIRST_NAME. C'est ce que fait le déclencheur INSTEAD OF dans Exemple 6-1.

NEW et OLD sont des pseudorecords que le moteur d'exécution PL/SQL crée et alimente chaque fois qu'un déclencheur au niveau de la rangée s'exécute. OLD et NEW stockent respectivement les valeurs initiale et nouvelle de l'enregistrement en cours de traitement par le déclencheur. Ils sont appelés pseudorecords car ils ne possèdent pas toutes les propriétés des enregistrements PL/SQL.

Exemple 6-1 : Créer un paramètre INSTEAD OF Trigger

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éer des déclencheurs qui enregistrent les événements LOGON et LOGOFF

Ce tutoriel explique comment utiliser 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 rangée à la table HR_USERS_LOG. Avant que quelqu'un se déconnecte en tant qu'utilisateur HR, HR_LOGOFF_TRIGGER ajoute une rangée à la table HR_USERS_LOG.

HR_LOGON_TRIGGER et HR_LOGOFF_TRIGGER sont des déclencheurs de système. HR_LOGON_TRIGGER est un déclencheur APRÈS et HR_LOGOFF_TRIGGER est un déclencheur AVANT.

Étapes de création des tables 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 : Informations de référence sur le langage PL/SQL pour Oracle Database pour plus d'informations sur les déclencheurs système