Demande d'aide sur une procédure de rechercher / remplacer
Bonjour
La procédure ci-dessous a pour but de faire une recherche dans l'ensemble des bases, en omettant le préfixe, afin de modifier des valeurs spécifiques dans des tables. Cette procédure a été écrite par un de mes développeurs.
Code:
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| DELIMITER |
DROP PROCEDURE IF EXISTS joomlaUsersGroups |
CREATE PROCEDURE joomlaUsersGroups()
BEGIN
DECLARE table_name VARCHAR(255);
DECLARE end_of_tables INT DEFAULT 0;
DECLARE cur CURSOR FOR
SELECT t.table_name
FROM information_schema.tables t
WHERE t.table_schema = DATABASE()
AND t.table_type = 'BASE TABLE'
AND t.table_name LIKE '%user\_usergroup\_map';
DECLARE CONTINUE HANDLER FOR NOT FOUND SET end_of_tables = 1;
OPEN cur;
tables_loop: LOOP
FETCH cur
INTO table_name;
IF end_of_tables = 1
THEN
LEAVE tables_loop;
END IF;
SET @s = CONCAT('UPDATE ', table_name, ' SET group_id = XXX WHERE user_id = XXX');
PREPARE stmt FROM @s;
EXECUTE stmt;
END LOOP;
CLOSE cur;
END |
DELIMITER ; |
Cette procédure marche bien, car je n'avais toujours qu'une seule table qui finissait par "user_usergroup_map" :
- XXX_user_usergroup_map
- YYY_user_usergroup_map
Toutefois, j'ai une autre base sur laquelle faire mon rechercher / remplacer global. Sauf que cette fois, elles finissent par _users. Et ce suffixe existe pour plein de tables :
- jos_users
- jos_jev_users
- jos_fb_users
- ...
Or moi, je ne veux cibler que la table jos_users.
Dans mon cas, le prefixe "jos_" change dans cette base. J'ai 30000 tables en tout
J'aurais donc par exemple en plus :
- academie20_users
- academie20_jev_users
- academie20_fb_users
- ...
Code:
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| DELIMITER |
DROP PROCEDURE IF EXISTS joomlaUsersGroups |
CREATE PROCEDURE joomlaUsersGroups()
BEGIN
DECLARE table_name VARCHAR(255);
DECLARE end_of_tables INT DEFAULT 0;
DECLARE cur CURSOR FOR
SELECT t.table_name
FROM information_schema.tables t
WHERE t.table_schema = DATABASE()
AND t.table_type = 'BASE TABLE'
AND t.table_name LIKE '%users';
DECLARE CONTINUE HANDLER FOR NOT FOUND SET end_of_tables = 1;
OPEN cur;
tables_loop: LOOP
FETCH cur
INTO table_name;
IF end_of_tables = 1
THEN
LEAVE tables_loop;
END IF;
SET @s = CONCAT('UPDATE IGNORE ', table_name, ' SET usertype = XXX WHERE id = XXX');
PREPARE stmt FROM @s;
EXECUTE stmt;
END LOOP;
CLOSE cur;
END |
DELIMITER ; |
Mais ça ne fonctionne pas, car dans certaines tables il n'existe pas de champ ID.
J'ai bien tenté de rajouter IGNORE après UPDATE mais ça ne marche toujours pas :
Citation:
#1054 - Unknown column 'id' in 'where clause'
Je n'y connais rien personnellement là-dedans. Si quelqu'un avait une solution, car mon développeur n'est plus dispo pour un moment.
J'espère avoir été assez clair !
Merci !