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".

AttentionAnciennes valeurs en lecture seule

Il n'est jamais possible de modifier une colonne ":old".

AttentionValeurs en lecture seule après

Pour les trigger "after", il n'est plus possible de modifier les colonnes ":new".

RemarqueValeurs 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.

RappelBD "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)

ExempleBD "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