Tp4 Trigger

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 6

GLSI2 Elaboré par

Ingénierie BD
Mme Boutaleb Manel

ISTIC Borj Cedria


TP4 : Les Triggers

Rappel :
Un déclencheur (trigger en anglais) est une procédure stockée qui est automatiquement
exécutée (ou "déclenchée") en réponse à certains événements dans une base de données
Oracle. Ces événements peuvent inclure des opérations telles que l'insertion, la mise à jour
ou la suppression de lignes dans une table.

Syntaxe :
Un déclencheur Oracle a la structure de base suivante :
CREATE OR REPLACE TRIGGER nom_du_trigger
[BEFORE | AFTER] [INSERT | UPDATE | DELETE]
ON nom_de_la_table
[FOR EACH ROW]
DECLARE
-- Déclarations de variables et de constantes
BEGIN
-- Logique du déclencheur
END;

Exemple :
Imaginons que nous avons une table etudiants où les emails sont insérés, et nous voulons
nous assurer que l'email est toujours en minuscules avant d'être inséré, afin d'uniformiser
les données.

1. Créer la table etudiants avec les colonnes id_etudiant, nom, prenom, email :

CREATE TABLE etudiants (


id_etudiant INT PRIMARY KEY,
nom VARCHAR2(50),

1
prenom VARCHAR2(50),
email VARCHAR2(100));

2. Créer le trigger BEFORE INSERT :

Créer un trigger qui s'exécute avant l'insertion d'un étudiant et qui convertit
automatiquement l'email en minuscules avant de l'insérer dans la table.

CREATE OR REPLACE TRIGGER normaliser_email


BEFORE INSERT ON etudiants
FOR EACH ROW
BEGIN
-- Convertir l'email en minuscules avant l'insertion
:NEW.email := LOWER(:NEW.email);
END;

3. Tester le bon fonctionnement du trigger :

-- Insérer un étudiant avec un email en majuscules


INSERT INTO etudiants (id_etudiant, nom, prenom, email)
VALUES (1, 'Dupont', 'Jean', 'JEAN.DUPONT@EMAIL.COM');

-- Vérifier la table pour voir l'email converti en minuscules


SELECT * FROM etudiants WHERE id_etudiant = 1;

Exercice:
Soit la BD de gestion de parc informatique suivante :

2
1. Écrivez le déclencheur Trig_Après_DI_Installer sur la table Installer permettant de
faire la mise à jour automatique des colonnes nbLog de la table Poste, et nbInstall de
la table Logiciel. Prévoir les cas de désinstallation d’un logiciel sur un poste, et
d’installation d’un logiciel sur un autre.

CREATE OR REPLACE TRIGGER Trig_Après_DI_Installer


AFTER INSERT OR DELETE ON Installer
FOR EACH ROW
BEGIN
IF DELETING
THEN
UPDATE Poste SET nbLog=nbLog - 1 WHERE nPoste = :OLD.nPoste;
UPDATE Logiciel SET nbInstall = nbInstall - 1 WHERE nLog = :OLD.nLog;
ELSE
IF INSERTING
THEN
UPDATE Poste SET nbLog = nbLog + 1 WHERE nPoste = :NEW.nPoste;
UPDATE Logiciel SET nbInstall = nbInstall + 1 WHERE nLog = :NEW.nLog;
END IF;
END IF;
END;
2. Écrivez le déclencheur Trig_Après_DI_Poste sur la table Poste permettant de mettre à jour
la colonne nbPoste de la table Salle à chaque ajout ou suppression d’un nouveau poste.

CREATE OR REPLACE TRIGGER Trig_Après_DI_Poste


AFTER INSERT OR DELETE ON Poste
FOR EACH ROW
BEGIN
IF DELETING THEN
UPDATE Salle SET nbPoste = nbPoste - 1 WHERE nSalle = :OLD.nSalle;
ELSE
UPDATE Salle SET nbPoste = nbPoste + 1 WHERE nSalle = :NEW.nSalle;
END IF;
END;

Pour tester:

3
INSERT INTO Poste (nPoste, nomPoste, indIP, ad, typePoste, nSalle, nblog)
VALUES (1, 'Poste1', 1, '192.168.1.2', 'PCc', 1, 105);
delete from Poste where nPoste=1;
rollback;
3. Écrivez le déclencheur Trig_Après_U_Salle sur la table Salle qui met à jour
automatiquement la colonne nbPoste de la table Segment après la modification de la colonne
nbPoste.

CREATE OR REPLACE TRIGGER Trig_Après_U_Salle


AFTER UPDATE OF nbPoste ON Salle
FOR EACH ROW
DECLARE
differ NUMBER;
BEGIN
differ := :NEW.nbPoste - :OLD.nbPoste;
UPDATE Segment SET nbPoste = nbPoste + differ
WHERE indIP = :NEW.indIP;
END;

La création et l’insertion des tables :


-- Création de la table Segment
CREATE TABLE Segment (
indIP INT PRIMARY KEY,
nomSegment VARCHAR2(50),
etage INT,
nbPoste INT
);

-- Insertion de données dans la table Segment


INSERT INTO Segment (indIP, nomSegment, etage, nbPoste)
VALUES (1, 'Segment1', 1, 10);

INSERT INTO Segment (indIP, nomSegment, etage, nbPoste)


VALUES (2, 'Segment2', 2, 15);

INSERT INTO Segment (indIP, nomSegment, etage, nbPoste)


VALUES (3, 'Segment3', 3, 20);

-- Création de la table Salle


CREATE TABLE Salle (
nSalle INT PRIMARY KEY,
nomSalle VARCHAR2(50),
nbPoste INT,
indIP INT REFERENCES Segment(indIP)
);

-- Insertion de données dans la table Salle


INSERT INTO Salle (nSalle, nomSalle, nbPoste, indIP)
VALUES (1, 'Salle101', 5, 1);

INSERT INTO Salle (nSalle, nomSalle, nbPoste, indIP)


VALUES (2, 'Salle201', 8, 2);

4
INSERT INTO Salle (nSalle, nomSalle, nbPoste, indIP)
VALUES (3, 'Salle301', 12, 3);

-- Création de la table Poste


CREATE TABLE Poste (
nPoste INT PRIMARY KEY,
nomPoste VARCHAR2(50),
indIP INT REFERENCES Segment(indIP),
ad VARCHAR2(50),
typePoste VARCHAR2(50),
nSalle INT REFERENCES Salle(nSalle),
nblog INT
);

-- Insertion de données dans la table Poste


INSERT INTO Poste (nPoste, nomPoste, indIP, ad, typePoste, nSalle, nblog)
VALUES (1, 'Poste1', 1, '192.168.1.1', 'PC', 1, 101);

INSERT INTO Poste (nPoste, nomPoste, indIP, ad, typePoste, nSalle, nblog)
VALUES (2, 'Poste2', 2, '192.168.2.1', 'PC', 2, 201);

INSERT INTO Poste (nPoste, nomPoste, indIP, ad, typePoste, nSalle, nblog)
VALUES (3, 'Poste3', 3, '192.168.3.1', 'Laptop', 3, 301);

-- Création de la table Logiciel


CREATE TABLE Logiciel (
nLog INT PRIMARY KEY,
nomLog VARCHAR2(50),
dateAch DATE,
version VARCHAR2(20),
nbInstall INT
);

-- Insertion de données dans la table Logiciel


INSERT INTO Logiciel (nLog, nomLog, dateAch, version, nbInstall)
VALUES (1, 'Logiciel1', TO_DATE('2022-01-01', 'YYYY-MM-DD'), '1.0', 5);

INSERT INTO Logiciel (nLog, nomLog, dateAch, version, nbInstall)


VALUES (2, 'Logiciel2', TO_DATE('2022-02-01', 'YYYY-MM-DD'), '2.0', 8);

INSERT INTO Logiciel (nLog, nomLog, dateAch, version, nbInstall)


VALUES (3, 'Logiciel3', TO_DATE('2022-03-01', 'YYYY-MM-DD'), '3.0', 12);

-- Création de la table Installer


CREATE TABLE Installer (
nPoste INT REFERENCES Poste(nPoste),
nLog INT REFERENCES Logiciel(nLog),
numIns INT,
dateIns DATE,
PRIMARY KEY (nPoste, nLog, numIns)
);

-- Insertion de données dans la table Installer


INSERT INTO Installer (nPoste, nLog, numIns, dateIns)
VALUES (1, 1, 1, TO_DATE('2022-04-01', 'YYYY-MM-DD'));

INSERT INTO Installer (nPoste, nLog, numIns, dateIns)


VALUES (2, 2, 1, TO_DATE('2022-04-02', 'YYYY-MM-DD'));

5
INSERT INTO Installer (nPoste, nLog, numIns, dateIns)
VALUES (3, 3, 1, TO_DATE('2022-04-03', 'YYYY-MM-DD'));

-- Création de la table Types


CREATE TABLE Types (
typeLP VARCHAR2(20) PRIMARY KEY,
nomType VARCHAR2(50)
);

-- Insertion de données dans la table Types


INSERT INTO Types (typeLP, nomType)
VALUES ('Type1', 'TypeA');

INSERT INTO Types (typeLP, nomType)


VALUES ('Type2', 'TypeB');

INSERT INTO Types (typeLP, nomType)


VALUES ('Type3', 'TypeC');

Vous aimerez peut-être aussi