Bonjour,
je pense avoir un souci avec un trigger.
En résumé, j'ai une table contact avec un téléphone, un email et une date de mise à jour pour ces 2 champs.
Mon trigger appelle ( en after) une fonction plpgsql qui compare les valeurs NEW et OLD pour vérifier si il y a besoin d'archiver l'ancienne valeur avant remplacement.
Quand ceci est fait, il fait un update de la date de mise à jour.
Si je ne fais pas l'update de la date, tout marche bien. Si je le fais, j'ai ce message :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 NOTICE: Modification de tel1 NOTICE: Validation de l enregistrement CONTEXT: SQL statement "UPDATE abadr SET datestoptel1=now() WHERE idadr= $1 " PL/pgSQL function "datemajabadr" line 17 at SQL statement NOTICE: Modification de tel1 NOTICE: Mise à jours de l enregistrement
Le code de la fonction est :
Le trigger est définie ainsi :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 CREATE OR REPLACE FUNCTION archivageAbadr() RETURNS TRIGGER AS $$ DECLARE utilisateur TEXT; isModified BOOL; BEGIN utilisateur := 'herve' isModified := false; -- Téléphone 1 IF (OLD.tel1!=NEW.tel1 OR OLD.stoptel1!=NEW.stoptel1 ) THEN DELETE FROM abadrhisto WHERE idadr=OLD.idadr AND donnee='tel1'; INSERT INTO abadrhisto (idadr,donnee,valeur,date,par) SELECT OLD.idadr,'tel1',OLD.tel1 || '/' || OLD.stoptel1 || '/' || OLD.datestoptel1, now(),utilisateur FROM abadr where idadr=OLD.idadr; UPDATE abadr SET datestoptel1=now() WHERE idadr=OLD.idadr; RAISE NOTICE 'Modification de tel1'; END IF; RETURN NEW; END; $$ LANGUAGE plpgsql;
En gros, je me demande si le fais de faire un update sur la table en cours ne redéclenche pas le trigger.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 CREATE TRIGGER tarchivageAbadr BEFORE UPDATE ON abadr FOR EACH ROW EXECUTE PROCEDURE archivageAbadr();
Est ce ma façon de modifier la valeur de la ligne qui est mauvaise ? J'ai essayé NEW.champ:=now() mais pas de résultat....
Si quelqu'un a une idée, je le remercie d'avance.
Partager