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
Il ne faut pas lire des données d'une table en cours de modification autrement que par les accès ":old" et ":new".
Il n'est jamais possible de modifier une colonne ":old".
Pour les trigger "after", il n'est plus possible de modifier les colonnes ":new".
Pour les triggers "on insert" les colonnes ":old" ont la valeur NULL.
Pour les triggers "on delete" les colonnes ":new" ont la valeur NULL.
Il ne faut pas modifier de données dans les colonnes des "primary key", "foreign key", ou "unique key" d'une table.
CREATE OR REPLACE TRIGGER trCours
BEFORE INSERT OR UPDATE OF debut ON tCours
FOR EACH ROW
BEGIN
:new.fin := :new.debut+5;
END;
/
UPDATE tCours
SET debut=TO_DATE('15-01-2001','DD-MM-YYYY')
WHERE pknum=3;
INSERT INTO tCours (pkannee, pknum, titre, type, fkIntervenant, debut)
VALUES ('2003', tCoursSeq.NEXTVAL, 'SQL', 'C', 'CROZAT', TO_DATE('22-01-2001','DD-MM-YYYY'));
SELECT pknum, debut, fin FROM tCours;
PKNUM DEBUT FIN
----- --------- ---------
1 01-JAN-01
2 02-JAN-01
3 15-JAN-01 20-JAN-01
4 22-JAN-01 27-JAN-01