Vous êtes sur la page 1sur 3

Université Ibn Tofail Préparé par Prof. H.

Chaoui
Ecole Nationale des Sciences Appliquées De la documentation de Formation Oracle
S8 GInfo
=================================================================================================
Trigger
Ce TD montre quelques exemples de déclencheurs et de fonctions PlSQL / pgplSQL. Se
souvenir que les déclencheurs sont exécutés à l'occurrence de certaines conditions définies par
le concepteur de base de données et que chaque fois qu'un déclencheur est exécuté, une
fonction particulière définie dans un est invoquée langage PlSQL ou pgplSQL.
En particulier, nous nous concentrerons sur les fonctions écrites dans le langage PlSQL.

Archivage de bateaux
Le premier exemple que nous allons voir est celui d'un déclencheur qui s'exécute chaque fois
qu'un tuple est supprimé de la table Bateaux et ajoute le tuple supprimé à la table ex_bateaux.
Tout d'abord, il est nécessaire de créer la table ex_bateaux avec le même schéma de relation
entre la table de bateaux.
Tout d'abord, nous définissons la fonction que le déclencheur va rappeler lors de son
exécution.
CREATE OR REPLACE FUNCTION archive_bateaux() RETURNS trigger AS
$archivage_bat$
BEGIN
-- Mettre à jour le tableau des bateaux qui ne sont plus utilisés
INSERT INTO ex_bateaux SELECT OLD.bid, OLD.bnom, OLD.couleur;
RETURN OLD;
END
Une fois la fonction créée, nous pouvons définir le déclencheur comme indiqué ci-dessous.
CREATE TRIGGER archivage_bateaux
AFTER INSERT OR UPDATE OR DELETE ON bateaux
FOR EACH ROW EXECUTE PROCEDURE archive_bateaux();

Exo #1 :
Créez une table ex_marins, avec le même schéma que de la table marins et définissez une
fonction et un déclencheur qui insère dans la table ex_marins chaque tuple supprimé de la
table des marins.
Statistiques de calcul de l'accès à la base de données
Cet exemple montre comment conserver des statistiques d'accès à la base de données chaque
fois qu'une commande de mise à jour, d'insertion ou de suppression est effectuée sur une table
de base de données.
Tout d'abord, il est nécessaire de créer une table qui contiendra les statistiques d'accès à la
base de données.
Le schéma de rapport statistique est présenté ci-dessous.
Column Type
Type_Acces character(1)
Nom-User character varying(20)
Temps timestamp with time zone

Une fois le schéma de la relation statistique créé, vous pouvez définir la fonction qui sera
appelée à chaque fois qu'un déclencheur est exécuté. La fonction de mise à jour des
statistiques est présentée ci-dessous.
CREATE OR REPLACE FUNCTION statistique_voile() RETURNS TRIGGER AS
$statistique_voile$
BEGIN
-- Crée une ligne dans la table qui reflète les modifications
-- apportées dans la database
IF (TG_OP = 'DELETE') THEN
INSERT INTO statistique SELECT 'D', user, now();
RETURN OLD;
ELSIF (TG_OP = 'UPDATE') THEN
INSERT INTO statistique SELECT 'U', user, now();
RETURN NEW;
ELSIF (TG_OP = 'INSERT') THEN
INSERT INTO statistique SELECT 'I', user, now();
RETURN NEW;
END IF;
RETURN NULL; -- Ignorer le résultat car nous sommes après le
-- déclenchement
END;
La variable TG_OP présente dans le script est une variable définie automatiquement par le
déclencheur qui appelle cette fonction et contenant l'opération qui a déclenché le déclencheur
lui-même. De cette façon, nous pouvons écrire une seule fonction pour gérer les deux
événements grâce à une commande de mise à jour, une commande d'insertion et une
commande de suppression. Au lieu de cela, la variable user contient le nom d'utilisateur qui a
exécuté la commande et qui a ensuite déclenché le déclencheur. La fonction now () renvoie
l'heure actuelle au format Timestamp (d'horodatage).
Une fois que la fonction de mise à jour des statistiques a été définie, il est nécessaire de
définir un déclencheur qui appelle cette fonction pour chaque table dont nous voulons
surveiller les statistiques. Voici les définitions des déclencheurs pour toutes les tables :
CREATE TRIGGER modif_statistique
AFTER INSERT OR UPDATE OR DELETE ON reservation
FOR EACH ROW EXECUTE PROCEDURE statistique_voile();
CREATE TRIGGER modif_statistique
AFTER INSERT OR UPDATE OR DELETE ON bateaux
FOR EACH ROW EXECUTE PROCEDURE statistique_voile();
CREATE TRIGGER modif_statistique
AFTER INSERT OR UPDATE OR DELETE ON marins
FOR EACH ROW EXECUTE PROCEDURE statistique_voile ();
CREATE TRIGGER modif_statistique
AFTER INSERT OR UPDATE OR DELETE ON ex_bateaux
FOR EACH ROW EXECUTE PROCEDURE statistique_voile ();
CREATE TRIGGER modif_statistique
AFTER INSERT OR UPDATE OR DELETE ON ex_marins
FOR EACH ROW EXECUTE PROCEDURE statistique_voile ();
Il est intéressant de noter que si les déclencheurs de mise à jour des statistiques et l’archivage
des tables de marins et bateaux sont définis dans la base de données, le phénomène des
déclencheurs, appelé en cascade, peut être observé.
.
Par exemple, lorsqu'un tuple est supprimé de la table bateaux, le déclencheur de mise à jour
des statistiques et le déclencheur de stockage de la valeur supprimée dans la table ex_bateaux
sont appelés. L'insertion dans la table ex_bateaux du tuple annulé des bateaux déclenche à son
tour un nouveau déclencheur de mise à jour statistique pour la table ex_bateaux.
Exo #2 :
On considère les relations de produit, les commandes et les produits corrélés, ainsi que les
modèles de relation suivants:
produits (pid: entier, nom: char [20], quantité: entier);
Commandes (Cid: entier, pid: entier, quantité: entier);
produits_correl (pid: entier, pcid: entier);
La relation produit contient l'identifiant du produit, son nom et la quantité de ce produit
actuellement en stock.
La relation products_correl contient l'id de deux produits liés l'un à l'autre. Un tuple de la
table produits_correl peut être exprimé en disant que le produit pcid est lié au produit pid.
La table commandes contient l'identifiant unique de la commande, le pid du produit auquel la
commande fait référence et la quantité à commander.
On considère comme exemple les instances suivantes de relations de produits et de produits
associés:
produits Produits_correl
pid nom quantité pid pcid
1 Parfum 1 2
2 Dentifrice 1 3
3 Savon 4 5
4 Brosse 4 6
5 Shampoing
6 Démêleur

Définir les contraintes de clé étrangère de manière appropriée, sachant qu'une commande ne
peut pas être passée si le produit n'est pas présent dans la table des produits et que deux
produits corrélés doivent être les deux présents dans la table des produits.
Exercice 1: Ecrire une fonction qui émule le comportement d'un compteur auto-incrémenté.
Insérer cette fonction de configuration automatique en tant que déclencheur appelé à
l'événement INSERT dans la table des commandes.
Exercice 2: Définir un déclencheur qui exécute une fonction de mise à jour des commandes
lorsque la quantité d'un produit donné tombe en dessous de 3 pièces. La fonction de mise à
jour de la commande est une fonction qui insère une nouvelle commande dans la table des
commandes. Notez que ce déclencheur n'a pas à s'inquiéter de la définition du numéro
progressif identifiant l'identifiant de commande, cela est fait par le déclencheur décrit ci-
dessus.
Il suffit que le déclencheur qui crée une nouvelle commande mette une valeur dans le champ
cid.
Exercice 3: Définir un déclencheur qui exécute une fonction de mise à jour de la commande
lorsque la quantité d'un produit donné tombe en dessous de 3 pièces et qui effectue une
commande relative également pour chaque produit corrélé au produit dont la quantité est
tombée en dessous de 3.

Vous aimerez peut-être aussi