#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
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
Oui,
D'ailleurs je me demande si faire cela re-déclencherait encore
le trigger, de manière infinie. Quelqu'un sait ?
oui
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
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
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();
Hors ligne