Pages: 1
- Sujet précédent - Trigger sous Postgresql : récupérer infos d'une autre table - Sujet suivant
#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
Pages: 1
- Sujet précédent - Trigger sous Postgresql : récupérer infos d'une autre table - Sujet suivant