Bonjour,

Voilà dans l'exemple suivant quand je rentre dans le if de la fonction "function_update_pds_salles_valide_before()", et alors qu'aucune modification n'est apporté à NEW dans la fonction, si NEW.valide était égale à 1 au début de la fonction celui-ci est égale à 0 au moment du return avant le END IF; et inversement si il était égale à 0 celui-ci est égale à 1 à la fin...
Donc si je cherche à faire un update du champs valide d'un enregistrement de pds_salles celui n'est pas modifié... --> "La requête a été exécutée avec succés : 0 lignes modifiées. La requête a été exécutée en 1453594 ms."

J'ai eu beau chercher je ne trouve pas d'explication... please help ;-)

le seul trigger de pds_salles :

----------------------------------------------------------------
CREATE TRIGGER update_pds_salles_valide_before
BEFORE UPDATE
ON pds_salles
FOR EACH ROW
EXECUTE PROCEDURE function_update_pds_salles_valide_before();
----------------------------------------------------------------

sa fonction associé :

---------------------------------------------------------------------
CREATE OR REPLACE FUNCTION function_update_pds_salles_valide_before()
RETURNS trigger AS
$BODY$DECLARE
new_valide INTEGER;
old_valide INTEGER;
old_id INTEGER;

BEGIN
new_valide := NEW.valide;
old_valide := OLD.valide;
old_id := OLD.id;
IF (old_valide <> new_valide) THEN
BEGIN
UPDATE pds_tables SET valide = new_valide WHERE id IN (SELECT id_table FROM relations_tables_salle WHERE id_salle = old_id);
UPDATE pds_murs SET valide = new_valide WHERE id IN (SELECT id_mur FROM relations_murs_salle WHERE id_salle = old_id);
END;
RETURN NEW;
END IF;
RETURN NEW;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100;
ALTER FUNCTION function_update_pds_salles_valide_before() OWNER TO mesange;
----------------------------------------------------------------------------

Les deux triggers sur pds_tables :
---------------------------------------------------------
CREATE TRIGGER update_pds_tables_after
AFTER UPDATE
ON pds_tables
FOR EACH ROW
EXECUTE PROCEDURE function_update_pds_tables_after();
---------------------------------------------------------

---------------------------------------------------------------
CREATE TRIGGER update_pds_tables_valide_before
BEFORE UPDATE
ON pds_tables
FOR EACH ROW
EXECUTE PROCEDURE function_update_pds_tables_valide_before();
----------------------------------------------------------------

Et les deux fonctions associés :
-----------------------------------------------------------------
CREATE OR REPLACE FUNCTION function_update_pds_tables_after()
RETURNS trigger AS
$BODY$DECLARE
BEGIN
UPDATE pds_salles SET nbcvt = (SELECT SUM(nbcvt) FROM pds_tables WHERE id IN (SELECT id_table FROM relations_tables_salle WHERE id_salle = pds_salles.id)) WHERE id = (SELECT id_salle FROM relations_tables_salle WHERE id_table = NEW.id);
RETURN NULL;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100;
ALTER FUNCTION function_update_pds_tables_after() OWNER TO mesange;
---------------------------------------------------------------------

----------------------------------------------------------------------
CREATE OR REPLACE FUNCTION function_update_pds_tables_valide_before()
RETURNS trigger AS
$BODY$
BEGIN
IF (NEW.valide <> 1) THEN
UPDATE pds_tables SET id_table_next = -1 WHERE id_table_next = NEW.id;
UPDATE pds_tables SET id_table_prev = -1 WHERE id_table_prev = NEW.id;
END IF;
RETURN NEW;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100;
ALTER FUNCTION function_update_pds_tables_valide_before() OWNER TO mesange;
-----------------------------------------------------------------------------

Il n'y a pas de trigger sur pds_murs.

Version de postgresql : PostgreSQL 8.3.1

En espérant avoir été clair...

merci d'avance ;-)