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 13/10/2022 11:06:42

Gisselmann
Membre

Trigger New.geom

Bonjour,

J'ai mis en place un projet Qgis dans le quel les utilisateurs peuvent rajouter des points qui correspondent à des infractions (dépôts de déchet, épandage …)   commises sur notre territoire.
Dans cette couche infraction il y a des informations sur la parcelle où est située l'infraction.

Et je souhaitais faire une fonction déclencheur qui permet de récupérer automatiquement  l'identifiant unique de la parcelle (geo_parcelle) qui est dans ma couche geo_parcelle. C'est pas une faute la table est le champ geo_parcelle ont le même nom.


Schéma : cadastre_35_2022_22_2022              Schéma : ppc
Table : geo_parcelle                                         Table : infraction
Colonne : geo_parcelle                                     Colonne: geo_par



La fonction utilisée:


REATE FUNCTION ppc.info_parcelle()
    RETURNS trigger
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE NOT LEAKPROOF
AS $BODY$
BEGIN
    IF TG_OP = 'INSERT' THEN

          
           NEW.geo_par := (SELECT geo_parcelle
                          FROM cadastre_35_2022_22_2022.geo_parcelle,ppc.infraction)
                          WHERE ST_Contains(geo_parcelle.geom,NEW.geom_point);
                        
    END IF;
   
    RETURN NEW;
END;
$BODY$;

ALTER FUNCTION ppc.info_parcelle()
    OWNER TO postgres;




Le trigger:


CREATE TRIGGER info_parcelle
    BEFORE INSERT
    ON ppc.infraction
    FOR EACH ROW
    EXECUTE FUNCTION ppc.info_parcelle();


Et du coup, j'ai un message d'erreur sur Qgis quand je souhaite enregistrer la nouvelle infraction.
J'ai testé la requête en dehors de la fonction et elle fonctionne, elle me renvoi bien geo_parcelle.


Message d'erreur sur Qgis:


Impossible de valider les changements pour la couche Infraction point

Erreurs : ERROR: 1 feature(s) not added.
 
Erreur du fournisseur de données :
      Erreur PostGIS lors de l'ajout d'entité : ERREUR:  entrée manquante de la clause FROM pour la table « geo_parcelle »
    LINE 3:            WHERE ST_Contains(geo_parcelle.geom,NEW.geom_poin...
                                         ^
    QUERY:  SELECT (SELECT geo_parcelle
                              FROM cadastre_35_2022_22_2022.geo_parcelle,ppc.infraction)
                              WHERE ST_Contains(geo_parcelle.geom,NEW.geom_point)
    CONTEXT:  fonction PL/pgSQL ppc.info_parcelle(), ligne 6 à affectation



Merci d'avance pour votre aide.

Bien cordialement,

Hors ligne

#2 13/10/2022 13:15:45

rjuju
Administrateur

Re : Trigger New.geom

Je me demande si l'ambiguité ne vient pas de l'affectation dans une variable.  Avez-vous toujours le problème si vous remplacez la fonction avec "SELECT geo_parcelle.geo_parcelle FROM cadastre..." ?

Hors ligne

#3 13/10/2022 13:40:24

Gisselmann
Membre

Re : Trigger New.geom

Effectivement, j'avais tester de rajouter geo_parcelle pour éviter toute ambiguïté mais il y a toujours la même erreur.

J'ai testé avec un autre jeu de donnée:  table geo_commune
                                                          champ nomcommune
Problème identique.

Jean

Hors ligne

#4 13/10/2022 14:39:18

rjuju
Administrateur

Re : Trigger New.geom

Ah, je viens de voir le problème!

           NEW.geo_par := (SELECT geo_parcelle
                          FROM cadastre_35_2022_22_2022.geo_parcelle,ppc.infraction)
                          WHERE ST_Contains(geo_parcelle.geom,NEW.geom_point);

La clause WHERE est en dehors de la clause SELECT, du fait du premier ensemble de parenthèses.

Hors ligne

#5 13/10/2022 15:20:00

Gisselmann
Membre

Re : Trigger New.geom

En déplaçant les parenthèses j'ai une amélioration mais toujours un message d'erreur

Erreur du fournisseur de données :
      Erreur PostGIS lors de l'ajout d'entité : ERREUR:  plus d'une ligne renvoyée par une sous-requête utilisée comme une expression

Effectivement quand je test la requête, elle me revoie tout les geo_parcelle qui contient un point mais je pensais que en utilisant NEW.geom_point dans la fonction ca allait prendre que le point du nouvel enregistrement ?

Hors ligne

#6 13/10/2022 17:23:55

rjuju
Administrateur

Re : Trigger New.geom

Oui, sur un trigger BEFORE INSERT new devrait contenir la valeur insérée.  Vous pouvez toujours ajouter un "RAISE NOTICE '%', st_astext(new.geom_point);" et effectuer un INSERT manuellement et valider le contenu.

Effectivement quand je test la requête, elle me revoie tout les geo_parcelle qui contient un point mais je pensais que en utilisant NEW.geom_point dans la fonction ca allait prendre que le point du nouvel enregistrement ?

Comment ça?  Si vous testez la requête avec un point quelconque la requête vous renvoit toutes les parcelles ?  Etes-vous sur que votre table geo_parcelle ne contient pas de geometrie qui se chevauchent ?

Hors ligne

#7 14/10/2022 10:09:22

Gisselmann
Membre

Re : Trigger New.geom

Bonjour,

J'ai trouver le problème !! wink

NEW.geo_par := (SELECT geo_parcelle
                          FROM cadastre_35_2022_22_2022.geo_parcelle)
                          WHERE ST_Contains(geo_parcelle.geom,NEW.geom_point);

Dans le FROM j'avais ppc.infraction alors que c'est un trigger qui est sur cette même table.
Du coup, ca renvoyait plusieurs NEW.geo_point


Merci de votre aide

Bonne journée

Hors ligne

Pied de page des forums