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 Mon 04 February 2019 11:10

jeremy.c91
Juste Inscrit !
Date d'inscription: 23 Oct 2018
Messages: 2

Besoin d'aide - Trigger de MAJ date de modification

Bonjour,
J’aurai besoin d'un petit coup de pouce.
Je désire réaliser un trigger qui insère la date du jour lors d'une modification sur un champ.
mais je bloque car mon trigger met a jour toutes les lignes du champ "date_modif"
alors qu'une clause limite la mise a jour (where OLD.test2 != NEW.test2)
Je ne compte pas pourquoi ce trigger réagit comme cela.
La solution est certainement évidante, mais elle m’échappe pour le moment.

Pouvez vous l’expliquer pourquoi ce comportement? Merci

Voici mon script :

CREATE OR REPLACE FUNCTION eau_potable.test()
  RETURNS trigger AS
$BODY$


BEGIN
IF (TG_OP ='UPDATE') THEN

update shemat.test
set  date_modif = current_date
where OLD.test2 != NEW.test2;

RETURN NEW;

END IF ;
END;

$BODY$

  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION shemat.test()
  OWNER TO postgres;

CREATE TRIGGER test_date_modif
  AFTER UPDATE
  ON shemat.test
  FOR EACH ROW
  EXECUTE PROCEDURE shemat.test();

Hors ligne

 

#2 Mon 04 February 2019 13:19

jmarsac
Participant assidu
Lieu: NICE
Date d'inscription: 26 Oct 2005
Messages: 572
Site web

Re: Besoin d'aide - Trigger de MAJ date de modification

Bonjour,
C'est normal, votre requête fait un update sur toute la table lorsque OLD.test2 est différent de NEW.test2. Il faut défini un trigger "BEFORE UPDATE" et utiliser la condition dans la fonction :

IF NEW.test2 IS DISTINCT FROM OLD.test2 THEN
   NEW.date_modif = current_date;
END IF;


Jean-Marie
Azimut

Hors ligne

 

#3 Mon 04 February 2019 13:39

tumasgiu
Membre
Lieu: Ajaccio
Date d'inscription: 5 Jul 2010
Messages: 1160

Re: Besoin d'aide - Trigger de MAJ date de modification

Oui,
les mots-clef BEFORE et AFTER sont un peu contrintuitifs.

l’événement BEFORE se déclenche après la mise à jour
d'une ligne, mais avant son écriture finale dans la table,
c'est donc dans cette fenêtre que vous pouvez modifier
la ligne en cours de mise à jour avant écriture,
ou annuler l'écriture.
AFTER se déroule après l'écriture, le seul moyen de faire
ce que vous voulez à ce moment là serait de récupérer l'id
de la ligne et de relancer une requête pour mettre à jour la colonne.
D'ailleurs je me demande si faire cela re-déclencherait encore
le trigger, de manière infinie. Quelqu'un sait ?

Dernière modification par tumasgiu (Mon 04 February 2019 13:42)

Hors ligne

 

#4 Mon 04 February 2019 13:49

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1554

Re: Besoin d'aide - Trigger de MAJ date de modification

tumasgiu a écrit:

Oui,
D'ailleurs je me demande si faire cela re-déclencherait encore
le trigger, de manière infinie. Quelqu'un sait ?


oui wink
Les récursions infinies sont possibles avec les triggers. Il faut faire attention.

Hors ligne

 

#5 Mon 04 February 2019 13:52

tumasgiu
Membre
Lieu: Ajaccio
Date d'inscription: 5 Jul 2010
Messages: 1160

Re: Besoin d'aide - Trigger de MAJ date de modification

Merci !
et ça donne quoi ?
ça termine la connexion ?
ou carrément le serveur ?

Dernière modification par tumasgiu (Mon 04 February 2019 14:09)

Hors ligne

 

#6 Mon 04 February 2019 14:07

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1554

Re: Besoin d'aide - Trigger de MAJ date de modification

Me rappelle plus bien. Je crois que ca tourne en boucle.
Laisse-moi trouver un serveur en prod où tester big_smile

Hors ligne

 

#7 Mon 04 February 2019 14:14

tumasgiu
Membre
Lieu: Ajaccio
Date d'inscription: 5 Jul 2010
Messages: 1160

Re: Besoin d'aide - Trigger de MAJ date de modification

Ca marche on fait çà.

Hors ligne

 

#8 Mon 04 February 2019 14:18

Yves
Membre du bureau
Lieu: Aix-les-Bains
Date d'inscription: 22 Mar 2006
Messages: 9869
Site web

Re: Besoin d'aide - Trigger de MAJ date de modification

il me semble qu'à un moment cela s'arrête avec un message : boucle infinie détectée.

Y.


Yves Jacolin, bénévole de l'association GeoRezo.net, agit au nom et pour le compte de l'association - Partageons ce qui nous départage !!  - GeoRezo vous aide ? Aidez GeoRezo !

Hors ligne

 

#9 Mon 04 February 2019 15:14

tumasgiu
Membre
Lieu: Ajaccio
Date d'inscription: 5 Jul 2010
Messages: 1160

Re: Besoin d'aide - Trigger de MAJ date de modification

Testé sur mon serveur de prod :

Code:

ERROR:  stack depth limit exceeded
ASTUCE : Increase the configuration parameter "max_stack_depth" (currently 2048kB), after ensuring the platform's stack depth limit is adequate.

comme espéré. Sans même terminer la connexion.

Hors ligne

 

#10 Mon 04 February 2019 18:32

jeremy.c91
Juste Inscrit !
Date d'inscription: 23 Oct 2018
Messages: 2

Re: Besoin d'aide - Trigger de MAJ date de modification

Super !!!
Cela marche parfaitement.
En effet, c’est logique.
Il n’y a pas de problème de boucle infinie sur la base_test
Si cela arrive sur la base de prod je l'indiquerais dans le topic



Merci beaucoup.


Je mets ici le script final. Cela pourrait aider d'autres personnes :

CREATE OR REPLACE FUNCTION shemat.test()
  RETURNS trigger AS
$BODY$


BEGIN
IF (TG_OP ='UPDATE') and  NEW.* IS DISTINCT FROM OLD.* THEN
   NEW.date_modif = current_date;


RETURN new;

END IF ;
END;

$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION shemat.test()
  OWNER TO postgres;


CREATE TRIGGER test_date_modif
  BEFORE UPDATE
  ON shemat.test
  FOR EACH ROW
  EXECUTE PROCEDURE shemat.test();

Hors ligne

 

#11 Thu 07 February 2019 19:02

sam92
Juste Inscrit !
Date d'inscription: 6 Nov 2018
Messages: 7

Re: Besoin d'aide - Trigger de MAJ date de modification

Bonsoir

Vous pouvez placer la condition dans les paramètres du TRIGGER, comme suit :

Code:

CREATE TRIGGER test_date_modif
    BEFORE UPDATE ON shemat.test
    FOR EACH ROW
    WHEN (OLD.test2 IS DISTINCT FROM NEW.test2)
    EXECUTE PROCEDURE shemat.test();

https://www.postgresql.org/docs/9.1/sql … igger.html

Hors ligne

 

Pied de page des forums

Powered by FluxBB