Conception Et Réalisation (Oracle) by Grare Stéphane - HTML preview

PLEASE NOTE: This is an HTML preview only and some elements such as links or page numbers may be incorrect.
Download the book in PDF, ePub, Kindle for a complete version.

Les attributs

Lors de l’écriture de ces triggers, il est possible d’utiliser des attributs pour identifier

précisément l’origine de l’événement et adapter les traitements en conséquence.

· ora_client_ip_adress

Adresse IP du poste client qui se connecte

· ora_database_name

Nom de la base de données

· ora_des_encrypted_password

Description codée du mot de passe de l'utilisateur créé ou modifié

· ora_dict_obj_name

Nom de l'objet visé par l'opération LDD

· ora_dict_obj_name_list

Liste de tous les noms d'objets modifiés

· ora_dict_obj_owner

Propriétaire de l'objet visé par l'opération LDD

· ora_dict_obj_owner_list

Liste de tous les propriétaires d'objets modifiés

145

· ora_dict_obj_type

Type de l'objet visé par l'opération LDD

· ora_grantee

Liste des utilisateurs disposant du privilège

· ora_instance_num

Numéro de l'instance

· ora_is_alter_column

Vrai si la colonne en paramètre a été modifiée

· ora_is_creating_nested_table

Création ou non d'une table de fusion

· ora_is_drop_column

Modification ou non de la colonne en paramètre

· ora_is_servererror

Vrai si le numéro erreur passée en paramètre se trouve dans la pile des erreurs

· ora_login_user

Nom de la connexion

· ora_privileges

Liste des privilèges accordés ou retirés par un utilisateur

· ora_revokee

Liste des utilisateurs à qui le privilège a été retiré

· ora_server_error

Numéro d'erreur dans la pile dont la position est passée en paramètre

· ora_sysevent

Nom de l'évènement système qui a activé le déclencheur

· ora_with_grant_option

Vrai si le privilège a été accordé avec option d'administration

Les évènements système

· STARTUP Evènement déclenché lors de l'ouverture de l'instance (AFTER seulement)

· SHUTDOWN Evènement déclenché avant le processus d'arrêt de l'instance (non déclenché

en cas d'arrêt brutal du serveur) (BEFORE seulement)

· SERVERERROR Evènement déclenché lors d'une erreur Oracle (sauf ORA-1034, ORA-1403,

ORA-1422, ORA-1423 et ORA-4030) (AFTER seulement)

Les évènements utilisateur

· LOGON Après une connexion (AFTER seulement)

· LOGOFF Avant une déconnexion (BEFORE seulement)

146

· CREATE Lors de la création d'un objet

· ALTER Lors de la modification d'un objet

· DROP Lors de la suppression d'un objet

· ANALYZE Lors de l'analyse d'un objet

· ASSOCIATE STATISTICS Lors de l'association d'une statistique

· AUDIT Lors de la mise en place d'un audit

· NOAUDIT Lors de l'annulation d'un audit

· COMMENT Lors de l'insertion d'un commentaire

· LDD Lors de l'exécution des ordres LDD (sauf ALTER DATABASE, CREATE CONTROLFILE

et CREATE DATABASE)

· DISSOCIATE STATISTICS Lors de la dissociation d'une statistique

· GRANT Lors de l'exécution d'une commande GRANT

· RENAME Lors de l'exécution d'une commande RENAME

· REVOKE Lors de l'exécution d'une commande REVOKE

· TRUNCATE Lors d'une troncature de table

Déclencheurs LMD

Un déclencheur LMD (Data Manipulation Language) est un type spécial de procédure stockée

qui présente trois caractéristiques :

· Il est associé à une table

· Il s’exécute automatiquement lorsqu’un utilisateur essaie de modifier des données par une

instruction LMD (UPDATE, DELETE, INSERT) sur la table ou il est défini.

· Il ne peut être appelé directement.

Le déclencheur et l’instruction qui a provoqué son exécution sont traités comme une seule

transaction. Le bloc PL/SQL qui constitue le déclencheur (trigger) peut être exécuté avant ou

après vérification des contraintes d’intégrité. Les triggers offrent une solution procédurale

pour définir des contraintes complexes non exprimables avec le CREATE TABLE ou qui

prennent en compte des données issues de plusieurs lignes ou de plusieurs tables.

Exemple : Garantir qu’un client ne peut avoir que deux factures non payées.

Lorsque la contrainte d’intégrité peut être exprimée au niveau de la définition de la table,

c’est cette solution qui sera privilégiée, car la vérification est plus rapide que l’exécution du

trigger. De plus, les contraintes d’intégrités garantissent que toutes les lignes de la table

respectent ces contraintes, tandis que les triggers ne prennent pas en compte les données

déjà présentes dans la table lorsqu’ils sont définis.

Utilisation des déclencheurs LMD

Les déclencheurs servent à maintenir une intégrité référentielle de bas niveau et non à

envoyer des résultats de requête. Leur avantage principal réside dans le fait qu’ils peuvent

contenir une logique de traitement complexe. Ils doivent être employés lorsque les

contraintes n’offrent pas les fonctionnalités nécessaires. On pourra utiliser les déclencheurs,

par exemple pour :

· Modifier en cascade les tables liées dans une base de données

147

· Mettre en œuvre une intégrité des données plus complexe qu’une contrainte CHECK. À la

différence des contraintes CHECK, les déclencheurs peuvent référencer des colonnes d’autres

tables. Par exemple, dans une gestion commerciale, lorsque la commande d’un article est

passée, une ligne est insérée dans la table Lignes de Commandes. Un déclencheur INSERT

sur cette table pourra déterminer si la commande peut être livrée ou non, en examinant la

colonne quantité en stock dans la table Stock. Si cette valeur est insuffisante, il pourra

générer automatiquement un ordre de commande fournisseur et avertir le gestionnaire.

· Renvoyer des messages d’erreur personnalisés les règles, les contraintes et les valeurs par

défaut ne peuvent communiquer des erreurs que par l’intermédiaire des messages d’erreur

système standards.

Règles lors de l’utilisation de déclencheurs :

· Les déclencheurs sont réactifs alors que les contraintes ont un caractère préventif. Les

contraintes sont contrôlées en premier, les déclencheurs sont exécutés en réponse à une

instruction INSERT, UPDATE ou DELETE.

· Il est possible de créer des déclencheurs sur des vues, ceux-ci sont de type INSTEAD OF.

· Les déclencheurs ne doivent pas renvoyer de jeux de résultats.

· Le propriétaire de la table et les rôles admin peuvent créer et supprimer des déclencheurs

sur une table. De plus le créateur du déclencheur doit avoir la permission d’exécuter toutes

les instructions sur toutes les tables. Si l’une des permissions est refusée, la transaction est

annulée totalement.

· Les données de la table à laquelle est associé le TRIGGER sont inaccessibles depuis les

instructions du bloc. Seule la ligne en cours de modification est accessible à l’aide de deux

variables de type RECORD, OLD et NEW, qui reprennent la structure de la table ou de la vue

associée.

Ces variables peuvent être utilisées dans la clause WHEN du trigger ou dans le bloc

d’instruction. Dans ce dernier cas, elles sont référencées comme des variables hôtes avec le

préfixe « : ».

Exemple : :OLD.nom_champ, : NEW.nom_champ

Le terme OLD permet de connaître la ligne en cours de suppression dans un trigger DELETE

ou la ligne avant modification dans un trigger UPDATE. Le terme NEW permet de connaître

la nouvelle ligne insérée dans un trigger INSERT ou la ligne après modification dans le trigger

UPDATE.

· Les prédicats INSERTING, UDATING et DELETING permettent au sein d’un déclencheur

commun pour les instructions INSERT, UPDATE et DELETE de savoir si le bloc PL/SQL est

exécuté à la suite d’une insertion une modification ou d’une suppression. Ces prédicats

retournent une valeur booléenne et sont utilisés dans la condition de test d’une instruction IF.

Il est ainsi possible d’écrire un déclencheur commun aux instructions INSERT et UPDATE,

par exemple, tout en conservant l’exécution conditionnelle de certaines instructions.

148

index-149_1.png

Création de déclencheurs

La création de déclencheurs s’effectue à l’aide de l’instruction CREATE TRIGGER. Cette

instruction spécifie la table sur laquelle le déclencheur est défini, l’événement provoquant son

exécution et les instructions qu’il contient.

CREATE [or REPLACE] TRIGGER nom_trigger

[BEFORE/AFTER/INSTEAD OF]

{INSERT/UPDATE[OF col,…]/DELETE}

ON Nom_Table [FOR EACH ROW]

[WHEN (condition)] Bloc PL/SQL;

OR REPLACE, Remplace la description du TRIGGER s’il existe déjà.

BEFORE : Le bloc PL/SQL est exécuté AVANT la vérification des contraintes de la table et la

mise à jour des données.

AFTER : Le bloc PL/SQL est exécuté APRES la mise à jour des données dans la table.

INSTEAD OF : Le bloc PL/SQL qui suit remplace le traitement standard associé à l’instruction

qui a déclenché le trigger.

INSERT/UPDATE …/DELETE : Instruction associée au déclenchement du trigger. Plusieurs

instructions peuvent déclencher le même trigger. Elles sont combinées par l’opérateur OR.

FOR EACH ROW : Le trigger s’exécute pour chaque ligne traitée par l’instruction associée.

WHEN (condition) : La condition donnée doit être vérifiée pour que le code s’exécute.

Les déclencheurs

Pour créer un déclencheur sous « Oracle SQL Developer », cliquez droit sur

« Déclencheurs » puis « Nouveau déclencheur… ».

149

index-150_1.png

index-150_2.png

index-150_3.png

Définissez les critères qui vous semblent appropriés au déclencheur que vous souhaitez

réaliser.

Il ne vous reste plus qu’à écrire votre déclencheur à partir du modèle.

Pour les besoins de l’exemple suivant, nous créons les tables suivantes :

create table produitnouveau (idp integer, nomp char(20), qte number);

create table produitSave (ids integer, noms char(20));

Écrivons le déclencheur suivant : Le trigger se déclenche à chaque insertion de produit dans la

table « produitnouveau » et enregistre dans la table « produitSave » les produits insérer

dont la quantité sont supérieur à 100.

create or replace trigger tr_log

150

index-151_1.png

index-151_2.jpg

index-151_3.png

index-151_4.png

after insert on produitnouveau

for each row when (new.qte > 100)

BEGIN

Insert into produitSave values (:new.idp, :new.nomp);

END tr_log;

Puis enregistrez votre déclencheur.

Pour tester notre déclencheur, alimentons la table « produitnouveau ».

insert into produitnouveau values (1, 'produit 1', 50);

insert into produitnouveau values (2, 'produit 2', 120);

insert into produitnouveau values (3, 'produit 3', 70);

Et interrogeons nos tables :

Et notre table « produitsave » ou notre déclencheur à enregistré les produits, dont la

quantité et supérieur à 100. Donc uniquement le produit 2.

151

index-152_1.png