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 27 July 2021 15:22

Demonshine
Participant occasionnel
Date d'inscription: 27 May 2021
Messages: 21

Trigger sous Postgresql : récupérer infos d'une autre table

Bonjour,

Lors de la mise à jour ou insertion d'un élément dans un table "nom" de type ponctuel, je souhaite récupérer certaines informations de la table "zone" de type polygone à l'intérieur de laquelle chaque point est contenu. J'ai donc essayé de mettre en place un trigger entre ces deux tables en utilisant "st_within" pour faire le lien entre les deux tables. Le problème est que mon trigger ne marche pas, soit il me remplit toutes mes lignes dans ma table "nom" avec les valeurs de la colonne spécifiée,  alors que je veux que ce soit juste la ligne modifiée ou créée qui soit remplie. Ou bien si dans ma condition IF je met "TG_OP="update" j'ai une boucle infinie. J'ai essayé d'utiliser la variable new mais j'obtiens une erreur comme quoi la variable new n'existe pas. Voici mon code :

Code:

CREATE OR REPLACE FUNCTION maj_nom()
RETURNS trigger AS
$BODY$
DECLARE
BEGIN

IF /*TG_OP = 'UPDATE' or */ TG_OP='INSERT' THEN
raise notice 'update_insert';

/* MAJ de la table "nom" : sur la colonne graphie. J'attribue la valeur toponyme de la table "zone" 
sur la colonne nature, j'attribue la valeur nature de la table "zone"
sur la colonne cleabs, j'attribue la valeur cleabs de la table "zone"
*/
UPDATE set graphie = toponyme,
nature=zone.nature,
cleabs=zone.cleabs

/* Je récupère la table "zone" car je l'utilise au dessus */
FROM zone
/* Je cherche la zone qui contient le toponyme dans la table : "nom" */
WHERE st_within(NEW.geom, zone.geom);


END IF;

return NEW;
END;
$BODY$
LANGUAGE plpgsql;


CREATE TRIGGER trigger_maj_nom
AFTER INSERT OR UPDATE
ON nom
FOR EACH ROW
EXECUTE PROCEDURE maj_nom();

Merci d'avance pour votre aide,

Hors ligne

 

#2 Tue 27 July 2021 16:26

JP LLORENS
Participant assidu
Date d'inscription: 12 Nov 2008
Messages: 231

Re: Trigger sous Postgresql : récupérer infos d'une autre table

Bonjour.
Comme c'est la table nom qui lance le trigger ET qui est actualisée, je pense qu'il faut plutôt faire un trigger BEFORE  (AFTER sera utilisé pour mettre à jour une autre table par exemple).
Ensuite :

Code:

CREATE OR REPLACE FUNCTION maj_nom()
RETURNS trigger AS
$BODY$
DECLARE

var_zone record;  /* déclaration d'une variable de type record (liste)*/

BEGIN

IF TG_OP = 'UPDATE' or TG_OP='INSERT' THEN

select toponyme,nature,cleabs FROM zone WHERE st_within(NEW.geom, zone.geom) into var_zone;
NEW.graphie = var_zone.toponyme;
NEW.nature=var_zone.nature;
NEW.cleabs = var_zone.cleabs;

END IF;

return NEW;
END;
$BODY$
LANGUAGE plpgsql;

Sans l'avoir tester, je pense que c'est grosso modo la solution
Cordialement
JP

Hors ligne

 

#3 Wed 04 August 2021 17:33

Demonshine
Participant occasionnel
Date d'inscription: 27 May 2021
Messages: 21

Re: Trigger sous Postgresql : récupérer infos d'une autre table

Merci beacoup JP, ça fonctionne très bien !

Hors ligne

 

Pied de page des forums

Powered by FluxBB