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.user
con 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_priv
aparece 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_priv
no 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
Tuve exactamente el mismo problema. Lo que hice fue:
Y problema resuelto.
PRECAUCIÓN: ¿Existe algún peligro en otorgar privilegios SUPER a un usuario?
fuente
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'
fuente