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.
Cette procédure marche bien, car je n'avais toujours qu'une seule table qui finissait par "user_usergroup_map" :
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
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 ;
- 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
- ...
Mais ça ne fonctionne pas, car dans certaines tables il n'existe pas de champ ID.
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
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 ;
J'ai bien tenté de rajouter IGNORE après UPDATE mais ça ne marche toujours pas :
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.#1054 - Unknown column 'id' in 'where clause'
J'espère avoir été assez clair !
Merci !
Partager