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
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 ...
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';
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.
Partager