0% ont trouvé ce document utile (0 vote)
9 vues5 pages

Triggers en PL/SQL : Guide Complet

Un trigger en PL/SQL est un bloc de code qui s'exécute automatiquement lors d'événements spécifiques sur une table ou une vue, tels que INSERT, UPDATE ou DELETE. Il est utilisé pour automatiser des contrôles métiers, maintenir des historiques et appliquer des règles d'intégrité. La syntaxe générale inclut des déclencheurs BEFORE, AFTER et INSTEAD OF, chacun ayant des usages spécifiques pour gérer les opérations sur les données.

Transféré par

sanekly.nadine
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
9 vues5 pages

Triggers en PL/SQL : Guide Complet

Un trigger en PL/SQL est un bloc de code qui s'exécute automatiquement lors d'événements spécifiques sur une table ou une vue, tels que INSERT, UPDATE ou DELETE. Il est utilisé pour automatiser des contrôles métiers, maintenir des historiques et appliquer des règles d'intégrité. La syntaxe générale inclut des déclencheurs BEFORE, AFTER et INSTEAD OF, chacun ayant des usages spécifiques pour gérer les opérations sur les données.

Transféré par

sanekly.nadine
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

🔹Un Trigger en PL/SQL

Un trigger (ou déclencheur) est un bloc de code PL/SQL stocké dans la base de
données qui s’exécute automatiquement lorsqu’un événement spécifique survient sur une
table ou une vue.​
Ces événements sont généralement :

●​ INSERT​

●​ UPDATE​

●​ DELETE​

On utilise les triggers pour :

●​ Automatiser des contrôles métiers​

●​ Maintenir des historiques​

●​ Appliquer des règles d’intégrité personnalisées​

🔹 Syntaxe générale
CREATE [OR REPLACE] TRIGGER nom_trigger
{BEFORE | AFTER | INSTEAD OF}
{INSERT | UPDATE | DELETE}
ON nom_table
[FOR EACH ROW]
[WHEN (condition)]
DECLARE
-- Déclarations locales
BEGIN
-- Instructions PL/SQL
END;

🔹 1. BEFORE (Avant)
Le trigger s’exécute avant que l’opération (INSERT, UPDATE ou DELETE) soit effectuée.

Utilisation typique :
●​ Valider ou modifier les données avant qu'elles soient insérées ou modifiées.​

●​ Empêcher une opération avec RAISE_APPLICATION_ERROR.​

Exemple :
CREATE OR REPLACE TRIGGER trg_verifier_salaire
BEFORE INSERT ON employes
FOR EACH ROW
BEGIN
IF :[Link] < 0 THEN
RAISE_APPLICATION_ERROR(-20002, 'Salaire invalide');
END IF;
END;

🔹 2. AFTER (Après)
Le trigger s’exécute après que l’opération a eu lieu avec succès.

Utilisation typique :

●​ Enregistrer l’opération dans une table de log.​

●​ Notifier, archiver, déclencher des actions secondaires.​

Exemple :
CREATE OR REPLACE TRIGGER trg_log_suppression
AFTER DELETE ON employes
FOR EACH ROW
BEGIN
INSERT INTO log_suppression (id_emp, date_suppression)
VALUES (:OLD.id_emp, SYSDATE);
END;

📌 Ici, on enregistre la suppression après qu'elle ait été faite.

🔹 3. INSTEAD OF (À la place de)


Le trigger s’exécute à la place de l’opération. Il est utilisé uniquement avec les vues, car
on ne peut pas directement modifier certaines vues complexes (jointures, agrégats...).

Utilisation typique :

●​ Permettre les opérations DML (INSERT, UPDATE, DELETE) sur des vues non
modifiables.​

Exemple :

Supposons une vue basée sur plusieurs tables :

CREATE VIEW vue_employes_postes AS


SELECT e.id_emp, [Link], p.nom_poste
FROM employes e
JOIN postes p ON e.id_poste = p.id_poste;

Cette vue ne peut pas être modifiée directement. On utilise donc un INSTEAD OF INSERT :

CREATE OR REPLACE TRIGGER trg_vue_employes_insert


INSTEAD OF INSERT ON vue_employes_postes
FOR EACH ROW
BEGIN
INSERT INTO employes (id_emp, nom, id_poste)
VALUES (:NEW.id_emp, :[Link],
(SELECT id_poste FROM postes WHERE nom_poste = :NEW.nom_poste));
END;

🔹 Exemple 1 : Trigger "AFTER INSERT"


Contexte : On veut enregistrer chaque insertion dans la table employes dans une table
d'historique log_employes.

Création des tables :


CREATE TABLE employes (
id_emp NUMBER PRIMARY KEY,
nom VARCHAR2(50),
poste VARCHAR2(50)
);

CREATE TABLE log_employes (


id_log NUMBER PRIMARY KEY,
id_emp NUMBER,
action VARCHAR2(20),
date_action DATE
);

Trigger :
CREATE OR REPLACE TRIGGER trg_log_insert_employe
AFTER INSERT ON employes
FOR EACH ROW
BEGIN
INSERT INTO log_employes (id_log, id_emp, action, date_action)
VALUES (log_employes_seq.NEXTVAL, :NEW.id_emp, 'INSERT', SYSDATE);
END;

Explication :

●​ :NEW.id_emp : fait référence à la valeur insérée​

●​ Ce trigger s’exécute après chaque insertion sur la table employes​

●​ Il ajoute une ligne dans log_employes​

🔹 Exemple 2 : Trigger "BEFORE UPDATE"


Contexte : Empêcher une baisse de salaire d’un employé.

CREATE OR REPLACE TRIGGER trg_prevent_salaire_baisse


BEFORE UPDATE ON employes
FOR EACH ROW
BEGIN
IF :[Link] < :[Link] THEN
RAISE_APPLICATION_ERROR(-20001, 'Interdiction de baisser le salaire');
END IF;
END;

Explication :

●​ :NEW correspond à la nouvelle valeur​

●​ :OLD correspond à l’ancienne valeur​


●​ Si le nouveau salaire est inférieur à l’ancien, l’opération est annulée.​

🔹 Exemple 3 : Trigger "AFTER DELETE"


Contexte : Sauvegarder les employés supprimés dans une table d’archives.

CREATE TABLE archive_employes AS SELECT * FROM employes WHERE 1=0;

CREATE OR REPLACE TRIGGER trg_archive_employe


AFTER DELETE ON employes
FOR EACH ROW
BEGIN
INSERT INTO archive_employes (id_emp, nom, poste)
VALUES (:OLD.id_emp, :[Link], :[Link]);
END;

Explication :

●​ Ce trigger copie la ligne supprimée dans une table d’archive.​

Vous aimerez peut-être aussi