Dans un sens politiquement correct, ce que vous venez de demander est impossible. Pourquoi ?
Le privilège SUPER est un privilège global et non un privilège de niveau base de données.
Lorsque vous avez créé l'utilisateur avec
grant all privileges on db1.* to user1@'%' with grant option;
vous avez rempli la table mysql.user
avec utilisateur = utilisateur1 et hôte = '%'. Toutes les autres colonnes (privilèges globaux) ont été définies par défaut sur 'N'. Une de ces colonnes est Super_priv
. Voici le tableau:
mysql> desc mysql.user;
+------------------------+-----------------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------------------+-----------------------------------+------+-----+---------+-------+
| Host | char(60) | NO | PRI | | |
| User | char(16) | NO | PRI | | |
| Password | char(41) | NO | | | |
| Select_priv | enum('N','Y') | NO | | N | |
| Insert_priv | enum('N','Y') | NO | | N | |
| Update_priv | enum('N','Y') | NO | | N | |
| Delete_priv | enum('N','Y') | NO | | N | |
| Create_priv | enum('N','Y') | NO | | N | |
| Drop_priv | enum('N','Y') | NO | | N | |
| Reload_priv | enum('N','Y') | NO | | N | |
| Shutdown_priv | enum('N','Y') | NO | | N | |
| Process_priv | enum('N','Y') | NO | | N | |
| File_priv | enum('N','Y') | NO | | N | |
| Grant_priv | enum('N','Y') | NO | | N | |
| References_priv | enum('N','Y') | NO | | N | |
| Index_priv | enum('N','Y') | NO | | N | |
| Alter_priv | enum('N','Y') | NO | | N | |
| Show_db_priv | enum('N','Y') | NO | | N | |
| Super_priv | enum('N','Y') | NO | | N | |
| Create_tmp_table_priv | enum('N','Y') | NO | | N | |
| Lock_tables_priv | enum('N','Y') | NO | | N | |
| Execute_priv | enum('N','Y') | NO | | N | |
| Repl_slave_priv | enum('N','Y') | NO | | N | |
| Repl_client_priv | enum('N','Y') | NO | | N | |
| Create_view_priv | enum('N','Y') | NO | | N | |
| Show_view_priv | enum('N','Y') | NO | | N | |
| Create_routine_priv | enum('N','Y') | NO | | N | |
| Alter_routine_priv | enum('N','Y') | NO | | N | |
| Create_user_priv | enum('N','Y') | NO | | N | |
| Event_priv | enum('N','Y') | NO | | N | |
| Trigger_priv | enum('N','Y') | NO | | N | |
| Create_tablespace_priv | enum('N','Y') | NO | | N | |
| ssl_type | enum('','ANY','X509','SPECIFIED') | NO | | | |
| ssl_cipher | blob | NO | | NULL | |
| x509_issuer | blob | NO | | NULL | |
| x509_subject | blob | NO | | NULL | |
| max_questions | int(11) unsigned | NO | | 0 | |
| max_updates | int(11) unsigned | NO | | 0 | |
| max_connections | int(11) unsigned | NO | | 0 | |
| max_user_connections | int(11) unsigned | NO | | 0 | |
| plugin | char(64) | YES | | | |
| authentication_string | text | YES | | NULL | |
| password_expired | enum('N','Y') | NO | | N | |
+------------------------+-----------------------------------+------+-----+---------+-------+
43 rows in set (0.00 sec)
mysql>
Super_priv
apparaît juste après Show_db_priv
.
Les privilèges de niveau base de données ont été renseignés mysql.db
. Le voici:
mysql> desc mysql.db;
+-----------------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------------+---------------+------+-----+---------+-------+
| Host | char(60) | NO | PRI | | |
| Db | char(64) | NO | PRI | | |
| User | char(16) | NO | PRI | | |
| Select_priv | enum('N','Y') | NO | | N | |
| Insert_priv | enum('N','Y') | NO | | N | |
| Update_priv | enum('N','Y') | NO | | N | |
| Delete_priv | enum('N','Y') | NO | | N | |
| Create_priv | enum('N','Y') | NO | | N | |
| Drop_priv | enum('N','Y') | NO | | N | |
| Grant_priv | enum('N','Y') | NO | | N | |
| References_priv | enum('N','Y') | NO | | N | |
| Index_priv | enum('N','Y') | NO | | N | |
| Alter_priv | enum('N','Y') | NO | | N | |
| Create_tmp_table_priv | enum('N','Y') | NO | | N | |
| Lock_tables_priv | enum('N','Y') | NO | | N | |
| Create_view_priv | enum('N','Y') | NO | | N | |
| Show_view_priv | enum('N','Y') | NO | | N | |
| Create_routine_priv | enum('N','Y') | NO | | N | |
| Alter_routine_priv | enum('N','Y') | NO | | N | |
| Execute_priv | enum('N','Y') | NO | | N | |
| Event_priv | enum('N','Y') | NO | | N | |
| Trigger_priv | enum('N','Y') | NO | | N | |
+-----------------------+---------------+------+-----+---------+-------+
22 rows in set (0.00 sec)
mysql>
Avis qui Super_priv
n'existe pas dans mysql.db
.
Pour visualiser ceci en termes SQL purs, connectez-vous en tant qu'utilisateur1 et exécutez SHOW GRANTS;
La sortie aura deux lignes:
GRANT USAGE ON *.* TO user1@'%' ...
GRANT ALL PRIVILEGES ON db1.* TO user1@'%' ...
Vous pouvez essayer un hack, mais normalement je ne le recommanderais pas.
ÉTAPE 01) Connectez-vous à mysql en tant que root @ localhost (devrait avoir tous les privilèges)
ÉTAPE 02) Exécuter cette requête
UPDATE mysql.user SET Super_Priv='Y' WHERE user='user1' AND host='%';
ÉTAPE 03) Exécuter cette requête
FLUSH PRIVILEGES;
Cela devrait théoriquement fonctionner. Ensuite, user1 peut fonctionner (je ne donne aucune garantie).
MISE À JOUR 2014-12-19 15:24 EST
Metafaniel vient de demander
Grande explication, merci. Toutefois, si vous ne recommandez pas cette méthode pour résoudre le problème, quelle autre méthode convient le mieux pour convertir un utilisateur en Super_priv ?? Merci! - Metafaniel
Dans la mesure où un utilisateur disposant uniquement d'un accès à une base de données ne peut pas utiliser SUPER , la seule chose à faire est de modifier manuellement DEFINER dans le vidage. L'idée de base serait de mysqldump les routines seules dans un fichier texte. Ensuite, éditez le définisseur à user1@'%'
. Ensuite, vous devriez pouvoir recharger.
Même chose pour les vues