Vous êtes sur la page 1sur 18

Bases de données

avancées (PL\SQL)

Med Ali Ben elhaj Aissa


PL\SQL chapitre 6
Les déclencheurs (triggers)
Définition

• Les triggers sont des simples procédures stockées qui


s’exécutent implicitement lorsqu’un événement se produit.

• En général, cet événement représente une opération LMD


sur une table. Les instructions: INSERT, UPDATE ou DELETE

• Les triggers sont des objets de la base ORACLE. Le nom du


trigger doit être unique dans la base de données.

3
Création d’un trigger Syntaxe

CREATE [OR REPLACE] TRIGGER <nomtrigger>


BEFORE | AFTER | INSTEAD OF
INSERT OR UPDATE OR DELETE
ON <nom_de_table>
[FOR EACH ROW]
DECLARE
<Déclarations>
BEGIN
<instructions>
END;
/

4
Création d’un trigger Explications
● L’événement déclenchant :
INSERT – DELETE – UPDATE – UPDATE [ OF nom_colonne, ...]
● Type de triggers :
Ligne FOR EACH ROW ou table (appliqué 1SEULe fois au
niveau table)
● Séquencement :
BEFORE – AFTER – INSTEAD OF (Vue seulement)
● ON : Table – Vue

5
Type de triggers.
Oracle propose deux types de triggers :

● Les triggers de lignes (ROW) qui se déclenchent


individuellement pour chaque ligne de la table affectée
par le trigger. L’option FOR EACH ROW est alors spécifiée.

● Les triggers de tables (STATEMENT) qui sont déclenchées


une seule fois, L’option FOR EACH ROW n’est pas spécifiée

6
Exemples de triggers de table Exemple 1

CREATE OR REPLACE TRIGGER trig_test_insertion


BEFORE
INSERT ON dept
Begin
dbms_output.put_line('OK');
End;
/
DROP TRIGGER trig_test_insertion;
/****************************************************/
DESC dept;

/****************************************************/

INSERT INTO dept VALUES(1,test,1,1);

7
Exemples de triggers de table Exemple 2
Pour cet exemple, nous allons créer une table appelée "LOG" où nous pourrons enregistrer le journal de
nos manipulations de la base de données.

create table log (


table_log varchar2(100),
date_log date,
username varchar2(50),
action varchar(255)
)

CREATE TRIGGER log


AFTER
INSERT OR UPDATE ON dept
BEGIN
INSERT INTO log (table_log, date_log, username, action) VALUES ('Emp', sysdate, sys_context
('USERENV','CURRENT_USER'),'INSERT/UPDATE on dept) ;
END ;

8
Exemples de triggers de table Exemple 2 suite

INSERT INTO dept VALUES (12,'dali',1,1);

SELECT * FROM log;

9
Exemples de triggers de table Exemple 3
CREATE OR REPLACE TRIGGER UPDATE_DEPT
BEFORE
UPDATE
ON dept
BEGIN
DBMS_OUTPUT.PUT_LINE(' Avant la mise à jour de quelque departement');
END;
/
/**************************************************************************************************/
UPDATE dept SET test= test+(test*0.5);

10
Exemples de triggers de table Exemple 4
CREATE OR REPLACE TRIGGER trig_test_insertion
BEFORE
INSERT OR UPDATE OR DELETE ON dept
BEGIN
IF inserting THEN DBMS_OUTPUT.PUT_LINE('insertiont');
ELSIF deleting THEN DBMS_OUTPUT.PUT_LINE('suppression');
ELSIf updating THEN DBMS_OUTPUT.PUT_LINE('mise a jour');
END IF;
END;
/

begin
INSERT INTO dept VALUES (159,'test159', 123,123);
UPDATE dept SET dept.department_name='test_update' where dept.department_id=159;
DELETE FROM dept WHERE dept.department_id=123;
end;

11
Triggers de lignes
Lors de la création de triggers lignes, il est possible d’avoir
accès à la valeur ancienne et la valeur nouvelle grâce aux
mots clés OLD et NEW.
Il n’est pas possible d’avoir accès à ces valeurs dans les
triggers de table.

→ :OLD et :NEW sont des variables qui donnent accès aux


deux états des données en cours de modification.

12
Prédicats
Dans un trigger ligne, on doit pouvoir accéder aux anciennes
et nouvelles valeurs de colonnes de la ligne.

Les noms permettent de désigner ces deux valeurs sont :


:New contient les nouvelles valeurs.
:OLD contient les anciennes valeurs

13
Exemples de triggers de lignes Exemple 1

CREATE OR REPLACE TRIGGER Employee_UPDATE_Salaire


BEFORE
UPDATE
ON Employees
FOR EACH ROW
BEGIN
DBMS_OUTPUT.PUT_LINE('Avant la mise à jour ' ||TO_CHAR(:OLD.salary) || ' vers ' ||
TO_CHAR(:NEW.salary));
END;
/****************************************************/
SELECT salary FROM employees where employee_id=100;
/****************************************************/
UPDATE employees SET salary=salary*2 where employee_id=100;
/****************************************************/
SELECT salary FROM employees where employee_id=100;

14
Exemples de triggers de lignes Exemple 2

CREATE OR REPLACE TRIGGER difference_salaire


BEFORE
UPDATE ON Employees
FOR EACH ROW
WHEN (new.salary > 5000)
DECLARE
sal_diff number;
BEGIN
sal_diff := :new.salary - :old.salary;
DBMS_OUTPUT.PUT_LINE(' Old : ' || :old.salary || 'New : ' || :new.salary || 'Difference : ' || sal_diff);
END ;
/
/****************************************************/
UPDATE employees SET salary=salary*2 where employee_id=100;

15
Activer/désactiver/supprimer un trigger

▪ Désactiver un trigger:

ALTER TRIGGER <nomtrigger> DISABLE;

▪ Activer un trigger:

ALTER TRIGGER <nomtrigger> ENABLE;

▪ Supprimer un trigger:

DROP TRIGGER <nomtrigger>;

16
Exercices
Exercice 1
CREATE TABLE emp_salary_history (employee_id number(5),
last_name varcHAR2(32), salary number(7,2) );
- Écrire un trigger permettant d'effectuer une insertion du salaire
ancien d’un employé dans la table emp_salary_history avant
d'effectuer une modification sur ce salaire.
- Mettre à jour le salaire à 3000 pour l’employé 100

Exercice 2
- Ecrire un trigger qui permet de vérifier pour chaque nouvelle
insertion dans la table employees si l’employee_id <1000 alors il
génère une exception "Numéro employé inférieur à 10000"
17

Vous aimerez peut-être aussi