Bonjour,
En premier lieu, j'annonce tout de suite que j'ai peu d'expérience en SGBD et en SQL. Ne soyez donc pas étonnés s'il vous semble que je prends le problème à l'envers. Dans ce dernier cas, je vous serais reconnaissant de m'indiquer « LA » bonne manière de traiter la chose.
Environnement : PostgreSQL 7.4.2 sous GNU/Linux
Mon souci est le suivant. J'ai 3 tables :
- - personne (liste des personnes ayant un jour adhéré à l'association) ;
- - adhesion (une personne pouvant quitter l'association puis y réadhérer, on peut avoir plusieurs fiches « adhesion » pour une seule personne) ;
- - cotisation (liée à une adhésion et à une personne).
Une requête SQL peut m'indiquer :
- - si une personne est adhérente à l'heure actuelle ;
- - si un adhérent est à jour de sa cotisation ;
- - l'ancienneté d'un adhérent.
Cependant, calculer ces informations à chaque fois est pénible et alourdit considérablement les requêtes. J'aimerais donc ajouter à la table « personne » des champs qui me fourniraient directement ces informations :
- - actif (la personne est-elle adhérente à l'heure actuelle ?) ;
- - ajour (l'adhérent est-elle à jour de cotisation ?) ;
- - anciennete (nombre de jours écoulés depuis l'adhésion).
Pour le premier champ (actif), ce n'est pas un problème. Des triggers sur INSERT et UPDATE dans la table adhesion me permettent de le mettre à jour à bon escient.
Pour le second (ajour), je peux bien créer un trigger pour basculer ce booléen à TRUE lorsque j'ajoute une cotisation. Par contre, lorsque l'échéance est dépassée, ce champ doit basculer à FALSE. Or, aucun événement interne ne me permet de déclencher une procédure de mise à jour.
Pour le troisième, le problème est du même ordre. Chaque jour, ce champ doit être incrémenté mais aucun événement interne ne me donne l'occasion de le faire.
Après réflexion, je me fiche bien que ces informations soient à jour à chaque instant. Ce qui m'importe, c'est qu'elles le soient lorsque j'adresse une requête à la base.
Or, s'il est possible d'associer un trigger à un INSERT, UPDATE ou DELETE, je n'ai rien trouvé de tel pour un SELECT.
Avez-vous une idée ?
Sébastien
PS : J'ai conscience qu'un trigger sur SELECT peut considérablement ralentir une base mais l'on peut très bien ajouter une table de gestion pour enregistrer la date de dernière mise à jour des champs « actif », « ajour » et « anciennete » et n'effectuer cette mise à jour qu'une fois par jour.
Partager