¿Cómo otorgar super privilegio al usuario?

44

He creado un usuario y otorgado privilegios al usuario1.

`grant all privileges on db1.* to user1@'%' with grant option;

Estoy usando mysql workbench para importar volcados a mi base de datos. Al importar volcados a la base de datos db1, se produce un error que indica que

ERROR 1227 (42000) at line 49: Access denied; you need (at least one of) the SUPER privilege(s) for this operation

En esos volcados, todas las tablas se importan correctamente, pero el error se produce al importar rutinas a la base de datos. ¿Hay algo malo con el privilegio que le he dado al usuario1? Por favor aconséjame.

borrar mi cuenta
fuente

Respuestas:

35

En un sentido políticamente correcto, lo que acaba de pedir es imposible. Por qué ?

El privilegio SUPER es un privilegio global, no un privilegio de nivel de base de datos.

Cuando creaste el usuario con

grant all privileges on db1.* to user1@'%' with grant option;

llenó la tabla mysql.usercon user = user1 y host = '%'. Todas las demás columnas (privilegios globales) se establecieron de manera predeterminada en 'N'. Una de esas columnas es Super_priv. Aquí está la tabla:

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_privaparece justo después Show_db_priv.

Los privilegios de nivel de base de datos se completaron mysql.db. Aquí es:

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>

Tenga en cuenta que Super_privno existe en mysql.db.

Para visualizar esto en términos de SQL puro, inicie sesión como usuario1 y ejecute SHOW GRANTS;La salida tendrá dos líneas:

  • GRANT USAGE ON *.* TO user1@'%' ...
  • GRANT ALL PRIVILEGES ON db1.* TO user1@'%' ...

Hay un truco que puedes probar, pero normalmente no lo recomendaría.

PASO 01) Inicie sesión en mysql como root @ localhost (debería tener todos los privilegios)

PASO 02) Ejecute esta consulta

UPDATE mysql.user SET Super_Priv='Y' WHERE user='user1' AND host='%';

PASO 03) Ejecute esta consulta

FLUSH PRIVILEGES;

Eso teóricamente debería funcionar. Entonces, user1 puede funcionar (no garantizo).

ACTUALIZACIÓN 2014-12-19 15:24 EST

Metafaniel acaba de preguntar

Gran explicación, gracias. Sin embargo, si no recomienda esa forma de resolver el problema, ¿cuál es la mejor manera de obtener un usuario de este Super_priv? ¡Gracias! - Metafaniel

Dado que un usuario con solo acceso a base de datos no puede tener SUPER , lo único que se puede hacer es cambiar el DEFINER manualmente en el volcado. La idea básica sería mysqldump solo las rutinas en un archivo de texto. Luego, edite el definidor a user1@'%'. Entonces, deberías poder recargar.

Lo mismo para las vistas

RolandoMySQLDBA
fuente
usando mariadb y la declaración de actualización "ERROR 1348 (HY000): la columna 'Super_priv' no es actualizable '
c4f4t0r
-6

Inicie sesión con el usuario root y seleccione la base de datos y ejecute la siguiente consulta SQL

SET @ @ global.sql_mode = 'NO_ENGINE_SUBSTITUTION'

RamK214
fuente
1
¿Cómo se relaciona esto con la pregunta? ¿Querías publicarlo en otro lugar?
dezso