Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL
PostgreSQL Forum PostgreSQL. Avant de poster -> F.A.Q PostGreSQL Tutoriels PostGreSQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 08/09/2007, 13h22   #1
Futur Membre du Club
 
Inscription : juillet 2005
Messages : 63
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 63
Points : 18
Points : 18
Envoyer un message via MSN à htristra
Par défaut 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.
htristra est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2007, 14h26   #2
Membre habitué
 
Inscription : août 2007
Messages : 128
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 128
Points : 146
Points : 146
Citation:
En gros, je me demande si le fais de faire un update sur la table en cours ne redéclenche pas le trigger.
Si, bien sûr.

Citation:
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....
Tu te trouves dans un TRIGGER AFTER, donc la ligne est déjà mise à jour. Toute modification de NEW sera non répercutée. Il te faut donc un TRIGGER BEFORE et ne pas faire un UPDATE supplémentaire, mais plutôt le
gleu_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2007, 19h27   #3
Futur Membre du Club
 
Inscription : juillet 2005
Messages : 63
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 63
Points : 18
Points : 18
Envoyer un message via MSN à htristra
Merci bien c'est exactement ça

Bon week end
htristra est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h49.


 
 
 
 
Partenaires

Hébergement Web