Version Mysql : 5.0.41

Bonjour à tous,
je débute avec les trigger, et je suis confrontée à un problème pour lequel je souhaite avoir votre avis.

Dans le cadre du développement d'un CMS, j'ai besoin de pouvoir gérer le positionnement d'objets au sein d'une liste, problème classique pour les CMS.
Par exemple, pouvoir ordonner des liens au sein de catégories, ou des images au sein d'un album, etc...

En découvrant les trigger, je me suis dit qu'une bonne partie de la tâche avait tout intérêt à être exécutée par le sgbd, pour simplifier l'application php, et pour garantir l'intégrité des données.

Bref, je me demande si cela est possible avec les versions de mysql actuelles.

Voici ci-dessous l'exemple sur lequel je travaille, et pour lequel j'obtiens une
erreur 1442 (- Can't update table 'ekw_menu_section' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.)
Cas d'application : table menu_section, avec colonne position


Mon trigger, ci-dessous, a pour but de mettre à jour l'ensemble des positions des objets de la table à l'insertion d'un nouvel enregistrement. Je n'ai pas encore bien peaufiner les règles de calcul, donc il y a peut-être des erreurs, mais ce n'est pas ce qui m'importe pour le moment. Car avant d'aller + loin, je voudrais m'assurer que ce que je souhaite est réalisable.


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
21
22
23
24
25
DELIMITER //
CREATE TRIGGER ekw_menu_section_created BEFORE INSERT  ON ekw_menu_section
FOR EACH ROW
 
BEGIN
DECLARE done int default 0;
DECLARE pos,id int;
DECLARE curpos CURSOR FOR SELECT section_id, position FROM ekw_menu_section WHERE afficher=1 AND menu_id=NEW.menu_id ORDER BY position;
DECLARE continue HANDLER FOR NOT FOUND SET done = 1;
SET @cpt = 1;
OPEN curpos;
REPEAT
FETCH curpos INTO id, pos;
if @cpt != NEW.position
then
if @cpt != pos then
UPDATE ekw_menu_section SET position=@cpt WHERE section_id=id;
end if;
end if;
set @cpt = @cpt + 1;
UNTIL done END REPEAT;
CLOSE curpos;
END//
 
DELIMITER ;

Le trigger est créé sans erreur, mais j'ai une erreur mysql 1442 lorsque je veux insérer un nouvel enregistrement.

Visiblement, le problème est que mysql interdit au trigger de faire un update sur la table concernée. (j'ai vérifié avec un trigger simplifié, exécutant simplement un update sur ma table, et j'ai le même pb).
Je suppose que c'est en relation avec ce qui est dit sur le site officiel :
http://dev.mysql.com/doc/refman/5.0/...-triggers.html

Il y a aussi des limitations dans ce qui peut apparaître dans la commande que le déclencheur peut éxecuter lorsqu'il est activé :

* Le déclencheur ne peut pas faire référence directe aux tables par leur nom, y copmris la table à laquelle il est associé. Par contre, vous pouvez utiliser les mots clés OLD (ancien en anglais) et NEW (nouveau en anglais). OLD fait référence à la ligne existante avant la modification ou l'effacement. NEW faire référence à la nouvelle ligne insérée ou à la ligne modifiée.
* Le déclencheur ne peut pas exécuter de procédures avec la commande CALL. Cela signifie que vous ne pouvez pas contourner le problèmes des noms de tables en appelant une procédure stockée qui utilise les noms de tables.

Qu'en pensez-vous?
Ai-je tort de vouloir traiter le positionnement d'objets avec des triggers?
Où ai-je seulement fais une erreur quelque part et c'est possible?

Merci de votre aide,