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

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Tue 25 January 2022 16:14

LAFONT40
Juste Inscrit !
Date d'inscription: 5 Sep 2012
Messages: 5

Trigger sur évènement UPDATE mais sur le dernier objet modifié

Bonjour,

Je galère sur l'écriture d'un trigger.
J'ai des triggers dans ma base PostgreSQL/Postgis qui me permettent de mettre à jour un certain nombre de champs.
Pour ce faire j'ai 2 procédures dans le trigger :
1 fonction sur "INSERT", 1 fonction sur modification géométrique, et je souhaiterais une fonction me permettant de jouer le trigger que si le champ "nom" est modifié.
Pouvez vous m'aider ??

merci d'avance


BEGIN
        --- Mise à jour par Trigger sur INSERT---   
               
           
            IF TG_OP = 'INSERT' THEN
               
                UPDATE batim_batimentlocalise
                SET (communeinsee,commune,groupement,departement,dernieremodifdate,dernieremodifheure) = (SELECT communeinsee,commune,groupement,departement,CURRENT_DATE,CURRENT_TIME  FROM terri_commune WHERE ST_Within(ST_Centroid(batim_batimentlocalise.geometrie), terri_commune.geometrie)LIMIT 1)WHERE fksdis40=NEW.fksdis40;
                UPDATE batim_batimentlocalise
                SET (plandeploiement) = (SELECT nom FROM terri_secteurops WHERE ST_Within(ST_Centroid(batim_batimentlocalise.geometrie),terri_secteurops.geometrie)LIMIT 1) WHERE fksdis40=NEW.fksdis40;
                UPDATE batim_batimentlocalise
                SET (pageatlaszoom) = (SELECT nom FROM Carroyage_200m_landes WHERE ST_Within(ST_Centroid(batim_batimentlocalise.geometrie), Carroyage_200m_landes.geometrie)LIMIT 1)WHERE fksdis40=NEW.fksdis40;
                UPDATE batim_batimentlocalise
                SET (pageatlascoordonnees) = (SELECT nom FROM Carroyage_foret_dptal WHERE ST_Within(ST_Centroid(batim_batimentlocalise.geometrie), Carroyage_foret_dptal.geometrie)LIMIT 1)WHERE fksdis40=NEW.fksdis40;

                RETURN NEW;
                END IF;

--- Mise à jour par Trigger sur modification géographique---


            IF ST_EQUALS(NEW.geometrie, OLD.geometrie) IS FALSE THEN
               
                UPDATE batim_batimentlocalise
                SET (communeinsee,commune,groupement,departement,dernieremodifdate,dernieremodifheure,modificateur) = (SELECT communeinsee,commune,groupement,departement,CURRENT_DATE,CURRENT_TIME,CURRENT_USER  FROM terri_commune WHERE ST_Within(ST_Centroid(batim_batimentlocalise.geometrie), terri_commune.geometrie)LIMIT 1)WHERE fksdis40=NEW.fksdis40;
                UPDATE batim_batimentlocalise
                SET (plandeploiement) = (SELECT nom FROM terri_secteurops WHERE ST_Within(ST_Centroid(batim_batimentlocalise.geometrie),terri_secteurops.geometrie)LIMIT 1) WHERE fksdis40=NEW.fksdis40;
                UPDATE batim_batimentlocalise
                SET (pageatlaszoom) = (SELECT nom FROM Carroyage_200m_landes WHERE ST_Within(ST_Centroid(batim_batimentlocalise.geometrie), Carroyage_200m_landes.geometrie)LIMIT 1)WHERE fksdis40=NEW.fksdis40;
                UPDATE batim_batimentlocalise
                SET (pageatlascoordonnees) = (SELECT nom FROM Carroyage_foret_dptal WHERE ST_Within(ST_Centroid(batim_batimentlocalise.geometrie), Carroyage_foret_dptal.geometrie)LIMIT 1)WHERE fksdis40=NEW.fksdis40;

               
                RETURN NEW;
                END IF;
            RETURN NEW;
            END;

Hors ligne

 

#2 Wed 26 January 2022 10:01

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

Re: Trigger sur évènement UPDATE mais sur le dernier objet modifié

Bonjour.
Pour l'appel d'un trigger sur la modification d'un attribut il faut spécifier cette colonne lors de la création du trigger.
Dans votre cas :

Code:

CREATE TRIGGER montrigger
  BEFORE INSERT OR UPDATE OF nom
  ON matable
  FOR EACH ROW
  EXECUTE PROCEDURE mafonctiontrigger();

Enfin, si j'ai bien compris votre problème.
Si vous modifiez une autre table ( UPDATE batim_batimentlocalise) que la table appelant le trigger, alors il faudra remplacer le before par after
Par contre je suis surpris de voir que vous placez des RETURN NEW un peu partout. Pour ma part je n'en mets qu'un seul à la fin de ma fonction trigger, juste avant le ENd;$Body$
Cordialement
JP

Dernière modification par JP LLORENS (Wed 26 January 2022 10:09)

Hors ligne

 

#3 Wed 26 January 2022 13:18

LAFONT40
Juste Inscrit !
Date d'inscription: 5 Sep 2012
Messages: 5

Re: Trigger sur évènement UPDATE mais sur le dernier objet modifié

Merci pour votre réponse je vais tester votre proposition

Hors ligne

 

#4 Wed 26 January 2022 13:41

LAFONT40
Juste Inscrit !
Date d'inscription: 5 Sep 2012
Messages: 5

Re: Trigger sur évènement UPDATE mais sur le dernier objet modifié

Cela fonctionne, merci beaucoup pour votre aide

Hors ligne

 

Pied de page des forums

Powered by FluxBB