Pages: 1
- Sujet précédent - BD Postgre/Postgis: trigger pour remplir un champ via jointure spatial - Sujet suivant
#1 Tue 13 October 2020 17:19
- ibou5va@hotmail.fr
- Juste Inscrit !
- Date d'inscription: 28 Jan 2019
- Messages: 5
BD Postgre/Postgis: trigger pour remplir un champ via jointure spatial
Bonjour,
Je dois remplir un champ "mtd_geographical_area" de ma table "t_well" par le champ "iso2_code" de ma table "country_standard_eureka_shape".
La table "t_well" est une couche de points qui est intersectée par la table "country_standard_eureka_shape" qui est elle une couche de polygone.
J'effectue donc une jointure spatiale pour alimenter le champ "mtd_geographical_area" dans la table "t_well".
Pour infos, les 2 tables sont dans le même schéma "catalogdb".
La requête ci-dessous fonctionne bien :
UPDATE catalogdb.t_well SET mtd_geographical_area = catalogdb.country_standard_eureka_shape.iso2_code FROM catalogdb.country_standard_eureka_shape WHERE ST_Intersects(catalogdb.t_well.point, catalogdb.country_standard_eureka_shape.geom);
Maintenant je souhaiterai que ce champ s'alimente automatiquement dès qu'un nouveau objet point est créé dans la table "t_well".
Je pense donc utiliser le trigger et une fonction pour l'exécuter. Voici le script utilisé:
CREATE OR REPLACE FUNCTION catalogdb.maj_well()
RETURNS trigger AS
$BODY$BEGIN
UPDATE catalogdb.t_well SET mtd_geographical_area = catalogdb.country_standard_eureka_shape.iso2_code FROM catalogdb.country_standard_eureka_shape WHERE ST_Intersects(catalogdb.t_well.point, catalogdb.country_standard_eureka_shape.geom);
return new;
END;
$BODY$ LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION catalogdb.maj_well()
OWNER TO postgres;
CREATE TRIGGER trigger_maj_well
BEFORE UPDATE
ON catalogdb.t_well
FOR EACH ROW
EXECUTE PROCEDURE catalogdb.maj_well();
Ma fonction est bien compilée et mon déclencheur bien créé.
Le problème est que lorsqu'un nouveau point est rajouté dans la table "t_well', toutes les valeurs du champ "mtd_geographical_area" passent à "Null" et les valeurs du champs "iso2_code" de la table "catalogdb.country_standard_eureka_shape" ne sont pas récupérées.
Quelqu'un aurait-il une idée?
Merci d'avance pour votre aide
Hors ligne
#2 Tue 13 October 2020 18:13
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1549
Re: BD Postgre/Postgis: trigger pour remplir un champ via jointure spatial
Bonsoir,
il ne faut pas faire un update dans votre trigger: vous etes deja en train d'updater la table !
Il faut donner une valeur à new.mtd_geographical_area en faisant une requete sql avec la valeur de new.point, par ex:
Code:
new.mtd_geographical_area := (select iso2_code FROM catalogdb.country_standard_eureka_shape where ST_Intersects(new.point, geom));
Nicolas
Hors ligne
#3 Wed 14 October 2020 10:48
- ibou5va@hotmail.fr
- Juste Inscrit !
- Date d'inscription: 28 Jan 2019
- Messages: 5
Re: BD Postgre/Postgis: trigger pour remplir un champ via jointure spatial
Merci Nicolas pour votre réponse.
Je dois intégrer du coup cette requête dans la fonction ou dans le trigger?
Merci encore pour votre aide
Hors ligne
#4 Wed 14 October 2020 12:07
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1549
Re: BD Postgre/Postgis: trigger pour remplir un champ via jointure spatial
Bonjour,
Le code est à mettre dans la fn de trigger, pas dans la def. du trigger lui meme.
pensez aussi a faire un trigger BEFORE UPDATE. (si vous faites un after update, c'est trop tard et vous ne pouvez plus définir de valeurs pour les nouveaux champs: l'opération d'update a déja eu lieu)
Nicolas
Hors ligne
#5 Wed 14 October 2020 14:00
- ibou5va@hotmail.fr
- Juste Inscrit !
- Date d'inscription: 28 Jan 2019
- Messages: 5
Re: BD Postgre/Postgis: trigger pour remplir un champ via jointure spatial
J'ai appliqué ainsi le code ci-dessous mais toujours valeur Null dans mon champ...
CREATE OR REPLACE FUNCTION catalogdb.maj_well()
RETURNS trigger AS
$BODY$BEGIN
new.mtd_geographical_area := (select iso2_code FROM catalogdb.country_standard_eureka_shape where ST_Intersects(new.point, geom));
return new;
END;
$BODY$ LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION catalogdb.maj_well()
OWNER TO postgres;
CREATE TRIGGER trigger_maj_well_before
BEFORE UPDATE
ON catalogdb.t_well
FOR EACH ROW
EXECUTE PROCEDURE catalogdb.maj_well();
Hors ligne
#6 Thu 15 October 2020 13:43
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1149
Re: BD Postgre/Postgis: trigger pour remplir un champ via jointure spatial
C'est possible que votre requête d'intersection ne renvoie rien, ou pire qu'elle renvoie plusieurs lignes,
dans ce cas-la, je ne sais pas si PostgreSQL effectue tout de même l'insert ou l'annule
à cause du plantage de la procédure !
Pour vérifier déjà que votre trigger se déclenche bien, vous pouvez remplacer votre requête
d'intersection par une chaine de caractère.
Votre trigger ne se déclenche actuellement qu'avant les commandes UPDATE, pour englober
les inserts, vous devez le spécifier : BEFORE INSERT OR UPDATE.
Sinon je ne connais pas vraiment le contexte d'utilisation, mais pour ce genre de chose j'aurai
tendance à plutôt privilégier une vue qui joindrait vos deux tables plutôt qu'un trigger.
Dernière modification par tumasgiu (Thu 15 October 2020 13:43)
Hors ligne
#7 Thu 15 October 2020 15:38
- ibou5va@hotmail.fr
- Juste Inscrit !
- Date d'inscription: 28 Jan 2019
- Messages: 5
Re: BD Postgre/Postgis: trigger pour remplir un champ via jointure spatial
Le trigger fonctionne bien, j'ai essayé avec une chaine de caractère....le champ se remplit bien.
Par contre quand je la remplace par la requête, elle ne renvoie rien..je n'ai aucune ligne....
new.mtd_geographical_area := (select iso2_code FROM catalogdb.country_standard_eureka_shape where ST_Intersects(new.point,geom));
Une idée?
Merci d'avance pour votre aide
Hors ligne
#8 Thu 15 October 2020 17:08
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1549
Re: BD Postgre/Postgis: trigger pour remplir un champ via jointure spatial
Vérifier les valeurs recues dans le trigger (avec raise notice ...) et tester la requête que vous utilisez dans le trigger avec ces valeurs.
Nicolas
Hors ligne
#9 Fri 16 October 2020 14:38
- ibou5va@hotmail.fr
- Juste Inscrit !
- Date d'inscription: 28 Jan 2019
- Messages: 5
Re: BD Postgre/Postgis: trigger pour remplir un champ via jointure spatial
Merci pour votre aide mais par contre je ne connais pas cette instruction et comment l'insérer...
Hors ligne
#10 Sat 17 October 2020 10:23
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1549
Re: BD Postgre/Postgis: trigger pour remplir un champ via jointure spatial
Hors ligne
Pages: 1
- Sujet précédent - BD Postgre/Postgis: trigger pour remplir un champ via jointure spatial - Sujet suivant