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


44

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 sauvegardes dans ma base de données. Lors de l’importation de dumps dans 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 cette sauvegarde, 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 at-il quelque chose de mal avec le privilège, j'ai donné à l'utilisateur1. S'il vous plaît des conseils.

Réponses:


35

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.useravec 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_privapparaî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_privn'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


Utilisation de mariadb et de l'instruction update "ERREUR 1348 (HY000): la colonne 'Super_priv' ne peut pas être mise à jour '
c4f4t0r le


-6

Connectez-vous avec l'utilisateur root, sélectionnez la base de données et exécutez la requête SQL suivante

SET @ @ global.sql_mode = 'NO_ENGINE_SUBSTITUTION'


1
Comment est-ce lié à la question? Vouliez-vous le poster ailleurs?
dezso
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.