#1 Mon 02 May 2022 17:00
- m_mclr
- Juste Inscrit !
- Date d'inscription: 20 Dec 2021
- Messages: 2
PostGis Trigger mise a jour d'un champ
Bonjour à tous,
Je débute avec les triggers et j'ai du mal a comprendre la mise en forme de la requête...
J'ai deux tables, une de ponctuels relative à des places et une de polygone relative à des quartiers
J'aimerai pouvoir mettre à jour (lors de la création d'une place) le nom du quartier dans lequel elle se trouve
Dans ma table "place" j'ai le champ "id_quartier" qui est lié par une relation Fk à ma table "quartier" et ainsi je peux récupérer le "nom_quartier"
J'ai essayé le trigger suivant , mais malheureusement je n'obtiens pas le résultat escompté..
Code:
CREATE OR REPLACE FUNCTION set_quartier() RETURNS trigger AS $BODY$ DECLARE BEGIN IF TG_OP = 'INSERT' OR TG_OP = 'UPDATE' THEN UPDATE place SET id_quartier = quartier.id_quartier FROM quartier WHERE st_contains(quartier.geom, NEW.geom); END IF; return NEW; END; $BODY$ LANGUAGE plpgsql; CREATE OR REPLACE TRIGGER set_quartier_trig AFTER INSERT OR UPDATE ON place FOR EACH ROW EXECUTE PROCEDURE set_quartier();
Merci d'avance! Margaux
Hors ligne
#2 Mon 02 May 2022 17:08
- Franck2908
- Participant actif
- Date d'inscription: 5 Mar 2010
- Messages: 85
Re: PostGis Trigger mise a jour d'un champ
Bonjour,
vous pouvez essayer ça :
IF NEW.geom is not null THEN
IF (TG_OP = 'INSERT') THEN
SELECT INTO NEW.id_quartier id_quartier FROM quartier WHERE st_contains(NEW.geom,quartier.geom);
RETURN NEW;
ELSIF (TG_OP = 'UPDATE' AND NEW.geom IS DISTINCT FROM OLD.geom) THEN
SELECT INTO NEW.id_quartier id_quartier FROM quartier WHERE st_contains(NEW.geom,quartier.geom);
RETURN NEW;
END IF;
END IF;
RETURN NEW;
Hors ligne
#3 Tue 03 May 2022 09:53
- m_mclr
- Juste Inscrit !
- Date d'inscription: 20 Dec 2021
- Messages: 2
Re: PostGis Trigger mise a jour d'un champ
Merci pour votre réponse, malheureusement cela n'a pas l'air de fonctionner..
Lorsque j'ajoute une nouvelle entité sur QGIS, le formulaire d'attribut me propose encore une liste déroulante de tous mes quartiers . Peut-être ai-je manqué une manip
Hors ligne
#4 Tue 03 May 2022 10:30
- JP LLORENS
- Participant assidu
- Date d'inscription: 12 Nov 2008
- Messages: 231
Re: PostGis Trigger mise a jour d'un champ
Bonjour
Essayez ça :
Code:
IF TG_OP = 'INSERT' OR TG_OP = 'UPDATE' THEN NEW.id_quartier = quartier.id_quartier FROM quartier WHERE st_contains(quartier.geom, NEW.geom); END IF;
D'autre part, dans votre cas il faut faire un trigger BEFORE.
Vous allez utiliser les triggers AFTER quand vous mettrez à jour une autre table que la table appelant le trigger.
Or c'est la table place qui appel et qui est mise à jour.
Ex: si vous aviez voulu mettre à jour la table des quartiers à partir des places, dans ce cas vous auriez utilisé un trigger AFTER.
Cordialement
JP
Hors ligne
#5 Tue 03 May 2022 10:35
- Franck2908
- Participant actif
- Date d'inscription: 5 Mar 2010
- Messages: 85
Re: PostGis Trigger mise a jour d'un champ
Merci pour votre réponse, malheureusement cela n'a pas l'air de fonctionner..
Lorsque j'ajoute une nouvelle entité sur QGIS, le formulaire d'attribut me propose encore une liste déroulante de tous mes quartiers . Peut-être ai-je manqué une manip
Rajouter une entité sur QGIS et regarder directement dans votre table via PGAdmin si le quartier a été mis à jour.
Votre formulaire d'attribut n'a pas lieu d'avoir une liste de déroulante pour le quartier puisque cela est intégré automatiquement par trigger. Il faut revoir votre formulaire et enlever ce choix de liste. C'est devenu un champ simple.
Dernière modification par Franck2908 (Tue 03 May 2022 10:36)
Hors ligne