Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#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
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
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.
Julien.
https://rjuju.github.io/
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
Pages : 1