Bonjour,

J'ai un problème de récursivité et je n'arrive pas à m'en sortir, donc je fais appel à vous.
Soit une table "lots" qui contient le champs "nouv_lot" et une table "remplacements_lots" qui contient le champs "nouv_lot_remplace".
Il se peut (et il y a) des "nouv_lot" qui ne sont pas dans "nouv_lot_remplace", et inversement.
Toutefois, si un "nouv_lot" est aussi dans "nouv_lot_remplace", son champs "actif" doit être à FALSE.
Je voulais donc faire un TRIGGER sur l'insert et sur l'update des 2 tables pour, si la valeur insérée ou modifiée dans une table est aussi dans l'autre table, mettre "actif" de "lots" à FALSE.
J'ai donc écrit le trigger suivant
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
CREATE OR REPLACE FUNCTION remplacement_lot()  RETURNS trigger AS
$BODY$BEGIN
	IF TG_TABLE_NAME = 'lots' THEN
		IF EXISTS(SELECT nouv_lot_remplace from remplacements_lots where nouv_lot_remplace = NEW.nouv_lot) THEN
			NEW.actif = FALSE;
		END IF;
	ELSE
		IF EXISTS(SELECT nouv_lot from lots where nouv_lot = NEW.nouv_lot_remplace) THEN
			UPDATE lots 
			SET actif = FALSE 
			WHERE nouv_lot = NEW.nouv_lot_remplace;
		END IF;
	END IF;
	RETURN NULL;
END;$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION remplacement_lot()
  OWNER TO jmdeneyer;
COMMENT ON FUNCTION remplacement_lot() IS 'Désactive le lot si le lot modifié ou inséré dans la colonne "nouv_lot_remplace" est dans la table lots';
Mais lorsque j'ajoute ou je modifie une valeur, l'autre table se met à jour, donc déclenche le trigger, qui remodifie la première table, etc ...

J'ai pensé diviser mon trigger en 2 pour faire un trigger pour chaque table, mais le problème sera le même, j'aurai aussi une boucle infinie.

Comment dois-je faire pour m'en sortir ?
Merci de vos z'avis z'avisés.