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 Re : Général » UPDATE select imbriqué » 26/10/2022 11:14:16

Pff je me complique la vie des fois

Merci !!!

#2 Général » UPDATE select imbriqué » 26/10/2022 10:32:00

Gisselmann
Réponses : 2

Bonjour c'est encore moi smile


Je souhaite mettre à jour un champ (proprietaire) d'une table (infraction) et la valeur à renseigner est le résultat d'un SELECT.

Or le SELECT me retourne plusieurs résultats et je ne sais pas comment affecter un résultat à la bonne ligne.


La requête qui effectivement me retourne 150 lignes


         SELECT parcelle_info.proprietaire
         FROM cadastre.parcelle_info,ppc.infraction
         WHERE geo_par=geo_parcelle


Et UPDATE que j'utilise


        UPDATE ppc.infraction SET proprietaire = (SELECT parcelle_info.proprietaire
        FROM cadastre_35_2022_22_2022.parcelle_info,ppc.infraction
         WHERE geo_par=geo_parcelle)


De quelle manière je pourrais procéder ?

Cordialement,

#3 Re : Général » Trigger New.geom » 14/10/2022 10:09:22

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

#4 Re : Général » Trigger New.geom » 13/10/2022 15:20:00

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 ?

#5 Re : Général » Trigger New.geom » 13/10/2022 13:40:24

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

#6 Général » Trigger New.geom » 13/10/2022 11:06:42

Gisselmann
Réponses : 6

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,

#7 Re : Général » Droit » 24/06/2022 13:01:50

Désolé du dérangement, ça fonctionne aussi de mon côté smile

#8 Général » Droit » 23/06/2022 15:10:25

Gisselmann
Réponses : 2

Bonjour,

Je souhaite savoir si il est possible de donner des droits seulement à un champ d'une table?

Je m'explique, j'ai une table "parcelle" qui contient un champ "exploite" et je voudrait que le group "ppc" puisse voir toute la table et juste modifier le champ "exploite"


J'ai essayé cette requête :

            GRANT SELECT, UPDATE (exploite) ON TABLE foncier.parcelle to ppc

La requête fonctionne mais UPDATE ne reste pas dans le sql de la table.

Merci d'avance pour votre aide.

Pied de page des forums

Propulsé par FluxBB