Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Suite à un problème technique intervenu entre le 22 et le 23 mars, nous avons du procéder dans la soirée du 25 mars, à la restauration de la base de données du 24 mars (matinée).

En clair, nous avons perdu vos contributions et inscriptions du dimanche 24 et du lundi 25 mars.
Nous vous prions de nous excuser.

#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: 1534

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: 1534

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: 1129

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: 1534

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: 1534

Re: BD Postgre/Postgis: trigger pour remplir un champ via jointure spatial

Hors ligne

 

Pied de page des forums

Powered by FluxBB