7.5 Exercices
193
© Dunod – La photocopie non autorisée est un délit.
7.18 Afficher pour chaque délégué et chaque localité, le nombre total de jours
pendant lesquels il a été responsable de cette localité.
Suggestion. L’intervalle de temps entre deux dates est un entier qui se calcule
par la différence entre ces dates.
7.19 Pendant quelles périodes les clients C400 et F011 ont-ils habité dans la même
localité ? Indiquer ces localités.
Suggestion. On effectue une auto-jointure temporelle de H_CLIENT sur
LOCALITE. Attention aux états jointifs de mêmes valeurs (coalescing).
7.20 Donner pour chaque localité les périodes durant lesquelles il y eu au moins
un client.
7.21 Quels sont les délégués qui ont eu une interruption de carrière ? Indiquer les
périodes d’interruption.
Suggestion. Il y a interruption lorsqu’il existe deux états E1 et E2 successifs
qui ne sont pas jointifs (E1.fin < E2.debut).
7.22 Pour contrôler la gestion de la table H_CLIENT, on propose les déclencheurs
suivants. Qu’en pensez-vous ?
Suggestion. En partant d’une table H_CLIENT contenant deux ou trois lignes
d’historique, et d’une suite de quelques événements d’évolution des entités
représentées, construisez soigneusement la trace de tous les événements et de
toutes les opérations définies par ces déclencheurs. A tout instant, observer
l’évolution de la table et vérifier si les contraintes d’intégrité sont respectées.
create trigger TRG_INSERT_CLI
before insert on H_CLIENT
for each row
begin
/* insérer un état courant si l’entité est inconnue
(= pas encore d’état pour cette entité) */
if (not exists(select * from H_CLIENT
where NCLI= new.NCLI)) then begin
new.debut = current_timestamp;
new.fin = 1-01-3000
end
end
create trigger TRG_B_UPDATE_CLI
before update on H_CLIENT
on each row
begin
/* définir le nouvel état courant */
new.debut = current_timestamp;
new.fin = 1-1-3000;
/* créer l’état précédent
*/
insert into H_CLIENT values(old.NCLI, old.debut,
193
© Dunod – La photocopie non autorisée est un délit.
7.18 Afficher pour chaque délégué et chaque localité, le nombre total de jours
pendant lesquels il a été responsable de cette localité.
Suggestion. L’intervalle de temps entre deux dates est un entier qui se calcule
par la différence entre ces dates.
7.19 Pendant quelles périodes les clients C400 et F011 ont-ils habité dans la même
localité ? Indiquer ces localités.
Suggestion. On effectue une auto-jointure temporelle de H_CLIENT sur
LOCALITE. Attention aux états jointifs de mêmes valeurs (coalescing).
7.20 Donner pour chaque localité les périodes durant lesquelles il y eu au moins
un client.
7.21 Quels sont les délégués qui ont eu une interruption de carrière ? Indiquer les
périodes d’interruption.
Suggestion. Il y a interruption lorsqu’il existe deux états E1 et E2 successifs
qui ne sont pas jointifs (E1.fin < E2.debut).
7.22 Pour contrôler la gestion de la table H_CLIENT, on propose les déclencheurs
suivants. Qu’en pensez-vous ?
Suggestion. En partant d’une table H_CLIENT contenant deux ou trois lignes
d’historique, et d’une suite de quelques événements d’évolution des entités
représentées, construisez soigneusement la trace de tous les événements et de
toutes les opérations définies par ces déclencheurs. A tout instant, observer
l’évolution de la table et vérifier si les contraintes d’intégrité sont respectées.
create trigger TRG_INSERT_CLI
before insert on H_CLIENT
for each row
begin
/* insérer un état courant si l’entité est inconnue
(= pas encore d’état pour cette entité) */
if (not exists(select * from H_CLIENT
where NCLI= new.NCLI)) then begin
new.debut = current_timestamp;
new.fin = 1-01-3000
end
end
create trigger TRG_B_UPDATE_CLI
before update on H_CLIENT
on each row
begin
/* définir le nouvel état courant */
new.debut = current_timestamp;
new.fin = 1-1-3000;
/* créer l’état précédent
*/
insert into H_CLIENT values(old.NCLI, old.debut,
