Forum Clubic

MySQL trigger replace

Bonjour à tous,
J’ai actuellement un petit souci pour la mise en place d’un trigger sur une table.

Mon but est que pour chaque INSERT UPDATE sur une table, le champ xml_data soit analysé, et que chaque :
caractère %c3%a9 soit remplacé par é
caractère %c3%a8 soit remplacé par è

Lors de mes différentes tentatives, soit j’ai une erreur lors d’un update ou d’un insert liée à ce trigger.

Voici mes tentatives :

delimiter //
CREATE TRIGGER avantUpdateTrigger BEFORE UPDATE
ON events_calendars FOR EACH ROW
BEGIN
UPDATE events_calendars SET xml_data = replace(xml_data , ‘%c3%a9’, ‘é’) WHERE id = NEW.id;
UPDATE events_calendars SET xml_data = replace(xml_data , ‘%c3%a8’, ‘è’) WHERE id = NEW.id;
UPDATE events_calendars SET xml_data = replace(xml_data , ‘%c3%a0’, ‘à’) WHERE id = NEW.id;
UPDATE events_calendars SET xml_data = replace(xml_data , ‘%c3%a7’, ‘ç’) WHERE id = NEW.id;
UPDATE events_calendars SET xml_data = replace(xml_data , ‘%c3%aa’, ‘ê’) WHERE id = NEW.id;
UPDATE events_calendars SET xml_data = replace(xml_data , ‘%c3%b9’, ‘ù’) WHERE id = NEW.id;
END//

CREATE TRIGGER avantInsertTrigger BEFORE INSERT
ON events_calendars FOR EACH ROW
BEGIN
UPDATE events_calendars SET xml_data = replace(xml_data , ‘%c3%a9’, ‘é’) WHERE id = NEW.id;
UPDATE events_calendars SET xml_data = replace(xml_data , ‘%c3%a8’, ‘è’) WHERE id = NEW.id;
UPDATE events_calendars SET xml_data = replace(xml_data , ‘%c3%a0’, ‘à’) WHERE id = NEW.id;
UPDATE events_calendars SET xml_data = replace(xml_data , ‘%c3%a7’, ‘ç’) WHERE id = NEW.id;
UPDATE events_calendars SET xml_data = replace(xml_data , ‘%c3%aa’, ‘ê’) WHERE id = NEW.id;
UPDATE events_calendars SET xml_data = replace(xml_data , ‘%c3%b9’, ‘ù’) WHERE id = NEW.id;
END//
delimiter ;

–> J’obtiens une erreur lors d’un update ou insert sur la table:
Can’t update table ‘events_calendars’ in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

Je n’ai pas plus compris lorsque j’ai cherché sur des forum ou sur la documentation de MySQL

Je vous remercie d’avance pour votre aide.

Logique :slight_smile:

si tu fais ça dans ton langage client (java, php, etc)


update events_calenders set xml_data = {xml_data} where id = {id}
__-> invoque trigger qui fait :
__UPDATE events_calendars SET xml_data = replace(xml_data , '%c3%a9', 'é') WHERE id = NEW.id;
____-> invoque trigger qui fait :
____UPDATE events_calendars SET xml_data = replace(xml_data , '%c3%a9', 'é') WHERE id = NEW.id;
____UPDATE events_calendars SET xml_data = replace(xml_data , '%c3%a8', 'è') WHERE id = NEW.id;
____UPDATE events_calendars SET xml_data = replace(xml_data , '%c3%a0', 'à') WHERE id = NEW.id;
____UPDATE events_calendars SET xml_data = replace(xml_data , '%c3%a7', 'ç') WHERE id = NEW.id;
____UPDATE events_calendars SET xml_data = replace(xml_data , '%c3%aa', 'ê') WHERE id = NEW.id;
____UPDATE events_calendars SET xml_data = replace(xml_data , '%c3%b9', 'ù') WHERE id = NEW.id;
__UPDATE events_calendars SET xml_data = replace(xml_data , '%c3%a8', 'è') WHERE id = NEW.id;
__UPDATE events_calendars SET xml_data = replace(xml_data , '%c3%a0', 'à') WHERE id = NEW.id;
__UPDATE events_calendars SET xml_data = replace(xml_data , '%c3%a7', 'ç') WHERE id = NEW.id;
__UPDATE events_calendars SET xml_data = replace(xml_data , '%c3%aa', 'ê') WHERE id = NEW.id;
__UPDATE events_calendars SET xml_data = replace(xml_data , '%c3%b9', 'ù') WHERE id = NEW.id;

Inutile de te faire un dessin sur ce que cela fait !

Pour le reste, je ne connais pas suffisamment les triggers mais je pense que tu devrais faire ta transformation avant, et pas dans le SQL.

Merci pour la réponse.

Je voulais à l’origine passer pas un trigger pour faire quelque chose de propre et qui soit automatisé.

Mais effectivement, ton idée peux m’arranger tout de même.

Je vais tenter cela.

A moins que des personnes m’aide pour mon trigger.