PLPGSQL : Mon trigger boucle t'il sur lui même ?
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:
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 :
Code:
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; |
Le trigger est définie ainsi :
Code:
1 2 3
|
CREATE TRIGGER tarchivageAbadr BEFORE UPDATE ON abadr
FOR EACH ROW EXECUTE PROCEDURE archivageAbadr(); |
En gros, je me demande si le fais de faire un update sur la table en cours ne redéclenche pas le trigger.
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.