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

#1 29/06/2012 14:54:20

Thomas
Membre

Trigger et Fonction spatiale

Bonjour à la communauté !

Je fais mes premiers pas sur PostgreSQL9.1/PostGis  (avec PgadminIII).  et je découvre le PL/pgSQL

J'ai 2 tables de type géométriques :
La table *mob_velo* de type ponctuel. et la table *secteur_urba* de type surfacique avec le nom du secteur contenu dans le champ *nom_sct*
Je dois rapatrier l'attribut *nom_sct* dans la table *mob_velo* par jointure spatiale. (le point est contenu dans la surface). Puisque je veux qu'à chaque création de points, le nom du secteur apparaisse ou se mette à jour, j'ai créer une fonction :

CREATE OR REPLACE FUNCTION mob.update_nom_sct()
  RETURNS trigger AS
$BODY$BEGIN
	select into NEW.nom_sct nom_sct from secteur_urba where st_within(NEW.geom, geom);
	return NEW ;
END;$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION mob.update_nom_sct()
  OWNER TO postgres;

et un trigger sur la table a updater :

CREATE TRIGGER update_nom_sct
  BEFORE INSERT OR UPDATE
  ON mob.mob_velo
  FOR EACH ROW
  EXECUTE PROCEDURE mob.update_nom_sct(); 


Dans l'environnement client (QGIS), lorsque je saisi un point, j'ai ce message d'erreur :

ERREUR:  la relation « secteur_urba » n'existe pas
LINE 1: select                  nom_sct from secteur_urba where st_w...
                                             ^
QUERY:  select                  nom_sct from secteur_urba where st_within(NEW.geom, geom)
CONTEXT:  PL/pgSQL function "update_nom_sct" line 2 at instruction SQL

Auriez vous déjà rencontré ce genre de problème ? J'ai beaucoup cherché sur internet, mais aucune solution à mon problème.
merci de votre aide qui me sera très precieuse pour avancer .

Thomas

Dernière modification par Thomas (29/06/2012 14:56:03)

Hors ligne

#2 29/06/2012 15:00:29

kenrio
Membre

Re : Trigger et Fonction spatiale

NEW entre guillemet si s'est bien majuscule

Dernière modification par kenrio (29/06/2012 15:00:45)

Hors ligne

#3 29/06/2012 15:32:54

Thomas
Membre

Re : Trigger et Fonction spatiale

bonjour kenrio,

J'ai tester votre solution, mais ça ne fonctionne pas mieux sad
je continue a chercher ...

Hors ligne

#4 29/06/2012 15:36:01

kenrio
Membre

Re : Trigger et Fonction spatiale

problème de search_path alors non ?

Hors ligne

#5 29/06/2012 16:02:27

Thomas
Membre

Re : Trigger et Fonction spatiale

A priori non puisque je référence ma fonction par le composant schéma (mob).

Hors ligne

#6 29/06/2012 16:06:45

kenrio
Membre

Re : Trigger et Fonction spatiale

pour en être sur moi je rajouterais un set search_path, les fonctions et les search_path c'est spécial quand même je trouve tongue

Dernière modification par kenrio (29/06/2012 16:07:08)

Hors ligne

#7 29/06/2012 16:10:19

rjuju
Administrateur

Re : Trigger et Fonction spatiale

Votre fonction sera bien dans le schéma mob, mais elle gardera effectivement le search_path par défaut (current_user et public).
Il faut que vous précisiez mob.secteur_urba dans vos requêtes, ou que vous modifiez le search_path. Personnellement je vous conseillerai de spécifier le nom du schéma, sauf cas spécifique, c'est plus sur.

Hors ligne

#8 29/06/2012 16:28:20

Thomas
Membre

Re : Trigger et Fonction spatiale

Effectivement ça marche mieux.  (Heureusement qu'on arrive en fin de semaine ...)

merci à vous deux pour votre aide !
kenrio, je tacherai de me documenter sur le search_path


pour ceux que ça intéresse voici le code de la fonction qui fonctionne: (le trigger reste inchangé)

CREATE OR REPLACE FUNCTION mob.update_nom_sct()
  RETURNS trigger AS
$BODY$BEGIN
	select into new.nom_sct nom_sct from mob.secteur_urba where st_within(new.geom, geom);
	return new ;
END;$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION mob.update_nom_sct()
  OWNER TO postgres;

Bon week end !!

Hors ligne

#9 29/06/2012 17:32:01

kenrio
Membre

Re : Trigger et Fonction spatiale

disons que la fonction est fixé au schéma et dans certain cas c'est pas forcément intéressant.

Hors ligne

Pied de page des forums