Manipulation des anciennes et nouvelles valeurs dans les triggers (:old et :new)
Pour les triggers de type "for each row", les colonnes de la ligne courante doivent être référencées spécifiquement selon que l'on veut l' ancienne ou la nouvelle valeur :
:old.nom_colonne
:new.nom_colonne
Fondamental :
Il ne faut pas lire des données d'une table en cours de modification autrement que par les accès ":old" et ":new".
Attention : Anciennes valeurs en lecture seule
Il n'est jamais possible de modifier une colonne ":old".
Attention : Valeurs en lecture seule après
Pour les trigger "after", il n'est plus possible de modifier les colonnes ":new".
Remarque : Valeurs nulles
Pour les triggers "on insert" les colonnes ":old" ont la valeur NULL.
Pour les triggers "on delete" les colonnes ":new" ont la valeur NULL.
Attention :
Il ne faut pas modifier de données dans les colonnes des "primary key", "foreign key", ou "unique key" d'une table.
Rappel : BD "Gestion des intervenants" : Schéma relationnel
1
tIntervenant (#pknom:varchar, prenom:varchar, poste:integer)
2
tCours (#pkannee:2000..2100, #pknum:integer, titre:varchar, type:C|TD|TP, fkintervenant=>tIntervenant, debut:date)
Exemple : BD "Gestion des intervenants" : Trigger de gestion de cohérence
1
CREATE OR REPLACE TRIGGER trCours
2
BEFORE INSERT OR UPDATE OF debut ON tCours
3
FOR EACH ROW
4
DECLARE
5
vAnneeDebut INTEGER;
6
BEGIN
7
vAnneeDebut := TO_NUMBER(TO_CHAR(:new.debut,'YYYY'));
8
IF NOT(vAnneeDebut = :new.pkannee) THEN
9
:new.debut:=null;
10
DBMS_OUTPUT.PUT_LINE('Inconsistency between debut and pkannee, debut set to null');
11
END IF;
12
END;
13
/
14
15
SET SERVEROUTPUT ON;
16
17
INSERT INTO tCours (pkannee, pknum, titre, type, fkIntervenant, debut)
18
VALUES ('2001', 3, 'SQL', 'C', 'CROZAT', TO_DATE('15-01-2001','DD-MM-YYYY'));
19
20
UPDATE tCours
21
SET debut=TO_DATE('15-01-2002','DD-MM-YYYY')
22
WHERE pknum=3;
23
24
SELECT pkannee, pknum, debut FROM tCours;
1
TRIGGER trCours compiled
2
1 rows inserted.
3
1 rows updated.
4
Inconsistency between debut and pkannee, debut set to null
5
6
PKAN PKNUM DEBUT
7
---- ----- ---------
8
2001 1 01-JAN-01
9
2001 2 08-JAN-01
10
2001 3