web-dev-qa-db-fra.com

Comment accorder un super privilège à l'utilisateur?

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.

46
delete my account

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).

MISE À JOUR 2014-12-19 15:24 EST

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.

Même chose pour les vues

37
RolandoMySQLDBA

J'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?

25
carla

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
1
Muniraj