PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 22/08/2017 15:09:30

dalivna
Membre

mise à jour champ automatique

Bonjour,

je me permets de vous solliciter après plusieurs tentatives,
Pour vous expliquer:
J'ai deux tables une intervention et l'autre ouvrage
Un champ id_ouvrage présent dans ma table intervention est renseigné automatiquement via une fonction trigger et un trigger lorsqu'une intervention est saisie sur cet ouvrage.


CREATE OR REPLACE FUNCTION public.id_equipt()
  RETURNS trigger AS
$BODY$DECLARE
BEGIN
IF TG_OP = 'INSERT' or TG_OP = 'UPDATE' THEN
  update public.intervention set id_ouvrage = public.ouvrage.id_ouvrage FROM public.ouvrage where st_intersects(intervention.geom, ouvrage.geom);
END IF;
return     NEW;
END$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION public.id_equipt()
  OWNER TO postgres;


CREATE TRIGGER id_equipt
  AFTER INSERT OR UPDATE OF geom
  ON public.intervention
  FOR EACH ROW
  EXECUTE PROCEDURE public.id_equipt();


Jusque là tout fonctionne.

Je souhaite maintenant dans un champ nb_intervention contenu dans ma table ouvrage renseigner le nombre d'intervention effectué sur chacun des ouvrages.
Pour cela j'ai effectué une requête SQL simple


UPDATE ouvrage set nb_intervention = (select count(intervention.id_ouvrage) from intervention where st_intersects (ouvrage.geom, intervention.geom));


Cette requête fonctionne lorsque je l'exécute mais je souhaiterai l'automatiser.

Dès qu'une intervention est créé sur un ouvrage le nombre d'intervention augmente automatiquement.

Et là je sèche!

Si l'un d'entre vous peut m'apporter son aide...

Merci d'avance

Hors ligne

#2 22/08/2017 16:30:16

rjuju
Administrateur

Re : mise à jour champ automatique

Bonjour,


Pour la première fonction, vous mettez à jour l'intégralité de la table intervention à chaque insertion ou modification.  Essayez plutôt de récupérer l'identifiant qui va bien et mettez le à jour pour la ligne uniquement avec un simple

NEW.id_ouvrage := la_valeur ;

Pour votre second problème, vous risquez d'avoir des résultats faux à la moindre exécution concurrente.  Avez-vous rencontré des problèmes de performances qui imposent de maintenir un compteur plutôt que calculer la données au besoin ?

Hors ligne

#3 23/08/2017 09:02:39

dalivna
Membre

Re : mise à jour champ automatique

Merci pour votre réponse.

Il n'y aura pas d'exécution concurrente étant donné qu'une seule personne intervient sur cette base.
J'ai besoin d'afficher en temps réel le nombre d'interventions sur ouvrage pour des consultations de personnes tierces. C'est pourquoi le calcul au besoin n'est pas envisageable ce qui j'en conviens aurait été beaucoup plus simple pour moi étant novice dans les requêtes SQL.

Cependant, je n'utilise peut-être pas la bonne méthode pour arriver à mes fins.

Hors ligne

Pied de page des forums