7.3 Les données temporelles
181
© Dunod – La photocopie non autorisée est un délit.
lors d’insertions secondaires demandées par les triggers d’update et de delete.
On observe que dans ces derniers cas, la valeur de fin désigne toujours un instant réel
et non le futur infini 1-01-3000, d’où la condition de déclenchement when.
create trigger TRG_INSERT_CLI
before insert on H_CLIENT
for each row
when (new.fin='1-1-3000')
begin
new.debut = current_timestamp;
end
La mise à jour d’une ou plusieurs colonnes doit se faire en deux temps, avant et
après l’opération. Avant celle-ci, l’état courant actuel est transformé en nouvel état
courant (nouvelle valeur de debut + exécution de l’update) :
create trigger TRG_B_UPDATE_CLI
before update on H_CLIENT
on each row
begin
new.debut = current_timestamp;
end
Après l’update, il faut recréer l’état précédent qui vient d’être transformé, constitué
des anciennes valeurs et de fin mise à l’instant présent :
create trigger TRG_A_UPDATE_CLI
after update on H_CLIENT
for each row
begin
insert into H_CLIENT values(old.NCLI, old.debut,
new.debut, old.NOM, old.LOCALITE, old.CAT);
end
Lors d’une suppression, qui efface effectivement l’état courant, il faut reconstituer
celui-ci doté d’une valeur de fin représentant l’instant présent 12 :
create trigger TRG_DELETE_CLI
after delete on H_CLIENT
on each row
begin
insert into H_CLIENT values (old.NCLI, old.debut,
current_timestamp, old.NOM, old.LOCALITE, old.CAT);
end
12. On observe que la valeur de fin est empruntée à l’état précédent et non tirée du registre
current_timestamp. La raison est simple : les deux valeurs doivent être identiques, alors que
les valeurs du registre extraites par les deux déclencheurs pourraient différer de quelques
millisecondes.
181
© Dunod – La photocopie non autorisée est un délit.
lors d’insertions secondaires demandées par les triggers d’update et de delete.
On observe que dans ces derniers cas, la valeur de fin désigne toujours un instant réel
et non le futur infini 1-01-3000, d’où la condition de déclenchement when.
create trigger TRG_INSERT_CLI
before insert on H_CLIENT
for each row
when (new.fin='1-1-3000')
begin
new.debut = current_timestamp;
end
La mise à jour d’une ou plusieurs colonnes doit se faire en deux temps, avant et
après l’opération. Avant celle-ci, l’état courant actuel est transformé en nouvel état
courant (nouvelle valeur de debut + exécution de l’update) :
create trigger TRG_B_UPDATE_CLI
before update on H_CLIENT
on each row
begin
new.debut = current_timestamp;
end
Après l’update, il faut recréer l’état précédent qui vient d’être transformé, constitué
des anciennes valeurs et de fin mise à l’instant présent :
create trigger TRG_A_UPDATE_CLI
after update on H_CLIENT
for each row
begin
insert into H_CLIENT values(old.NCLI, old.debut,
new.debut, old.NOM, old.LOCALITE, old.CAT);
end
Lors d’une suppression, qui efface effectivement l’état courant, il faut reconstituer
celui-ci doté d’une valeur de fin représentant l’instant présent 12 :
create trigger TRG_DELETE_CLI
after delete on H_CLIENT
on each row
begin
insert into H_CLIENT values (old.NCLI, old.debut,
current_timestamp, old.NOM, old.LOCALITE, old.CAT);
end
12. On observe que la valeur de fin est empruntée à l’état précédent et non tirée du registre
current_timestamp. La raison est simple : les deux valeurs doivent être identiques, alors que
les valeurs du registre extraites par les deux déclencheurs pourraient différer de quelques
millisecondes.
