J'ai créé un utilisateur et donné des privilèges à l'utilisateur1.
`grant all privileges on db1.* to user1@'%' with grant option;
J'utilise mysql workbench pour importer des vidages dans ma base de données. Lors de l'importation de vidages vers la base de données db1, une erreur se produit indiquant que
ERROR 1227 (42000) at line 49: Access denied; you need (at least one of) the SUPER privilege(s) for this operation
Dans ce vidage, toutes les tables sont importées avec succès, mais l'erreur se produit lors de l'importation de routines dans la base de données. Y a-t-il quelque chose de mal avec le privilège que j'ai donné à l'utilisateur1. Veuillez conseiller.
Dans un sens politiquement correct, ce que vous venez de demander est impossible. Pourquoi ?
Le privilège SUPER est un privilège global, pas un privilège au niveau de la 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 user = user1 et Host = '%'. Toutes les autres colonnes (privilèges globaux) ont été définies par défaut sur "N". L'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 au niveau de la base de données ont été remplis dans 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>
Remarquerez que Super_priv
n'existe pas dans mysql.db
.
Pour visualiser cela 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@'%' ...
Il y a un hack que vous pouvez essayer mais je ne le recommanderais pas normalement.
ÉTAPE 01) Connectez-vous à mysql en tant que root @ localhost (devrait avoir tous les privilèges)
ÉTAPE 02) Exécutez cette requête
UPDATE mysql.user SET Super_Priv='Y' WHERE user='user1' AND Host='%';
ÉTAPE 03) Exécutez cette requête
FLUSH PRIVILEGES;
Cela devrait théoriquement fonctionner. Ensuite, user1 peut fonctionner (je ne donne aucune garantie).
Metafaniel vient de demander
Excellente explication, merci. Cependant, si vous ne recommandez pas cette façon de résoudre le problème, alors quelle autre façon est la meilleure pour gran un utilisateur ce Super_priv ?? Merci! - Metafaniel
Puisqu'un utilisateur avec seulement un accès DB ne peut pas avoir SUPER , la seule chose que l'on peut faire est de changer manuellement le DEFINER dans le vidage. L'idée de base serait de mysqldump les routines seules dans un fichier texte. Ensuite, modifiez le définisseur sur user1@'%'
. Ensuite, vous devriez pouvoir recharger.
Oct 02, 2011
: mysqldump peut-il vider les déclencheurs et les procédures?Jul 25, 2011
: DROP PROCEDURE IF EXISTS non inclus dans mysqldumpJul 25, 2011
: Vider uniquement les procédures stockées dans MySQLMême chose pour les vues
Mar 23, 2012
: Autorisation des vues MySQLJul 26, 2011
: Modifier DEFINER sur plusieurs vuesJ'ai eu exactement le même problème. Ce que j'ai fait, c'est:
GRANT SUPER ON *.* TO user1@localhost
Et problème résolu.
CAVEAT: Y a-t-il un danger à accorder des privilèges SUPER à un utilisateur?
L'erreur "Accès refusé" pendant le processus d'importation peut être due à la non-concordance des privilèges pour les DEFINITEURS entre la base de données exportée et la base de données à importer. J'ai fait face à la même situation et la commande ci-dessous fonctionne bien pour moi pour importer la base de données avec succès.
cat db1.sql | sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' | mysql -u user1 -p db1