Par mesange le 28/07/2008 - 16:13
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 ;-)