MySQL almacena la información sobre los usuarios y sus privilegios en una base de datos como cualquier otra, cuyo nombre es mysql. Si exploramos su estructura, entenderemos la manera como MySQL almacena la información de sus usuarios y privilegios:
Es posible realizar modificaciones directamente sobre estas tablas y obtener los mismos resultados que si utilizáramos los comandos grant, revoke, set password o drop user:
mysql> update user
-> set Password = password(´nuevapasswd´)
-> where User =´visitante´ and Host = ´localhost´;
mysql> flush privileges;
El comando flush privileges solicita a MySQL que vuelva a leer las tablas de privilegios. En el momento de ejecutarse, el servidor lee la información de estas tablas sobre privilegios. Pero si se han alterado las tablas manualmente, no se enterará de los cambios hasta que utilicemos el comando flush privileges.
Tabla | Contenido |
user | Cuentas de usuario y sus privilegios globales |
db | Privilegios sobres bases de datos |
tables_priv | Privilegios sobre tablas |
columns_priv | Privilegios sobre columnas |
host | Privilegios de otros equipos anfitriones sobre bases de datos |
El acceso directo a las tablas de privilegios es útil en varios casos; por ejemplo, para borrar un usuario del sistema en las versiones de MySQL anteriores a la 4.1.1:
mysql> delete from user
-> where User = ´visitante´ and Host = ´localhost´;
mysql> flush privileges;
No es posible eliminar mediante un solo comando revoke todos los privilegios de un usuario.
Ejemplo
Se otorgan derechos a un usuario con dos comandos grant.
Observando el contenido de la base de datos de privilegios, podemos entender el comportamiento de los comandos grant y revoke. Primero asignamos privilegios para usar el comando select al usuario visitante con dos comandos grant: el primero de ellos le permite el ingreso desde el servidor nuestra-ong.org y el segundo le otorga el mismo tipo de privilegio, pero desde cualquier equipo en Internet.
mysql> grant select
-> on *.*
-> to visitante@nuestra-ong.org;
Query OK, 0 rows affected (0.01 sec)
mysql> grant select
-> on *.*
-> to visitante@´%´;
Query OK, 0 rows affected (0.00 sec)
Consultando la tabla user de la base de datos de privilegios, podemos observar los valores ’Y’ en la columna del privilegio select.
mysql> select user,host,select_priv from user
-> where user = ´visitante´;
+-----------+----------------------+----------------+
| user | host | select_priv |
+-----------+----------------------+----------------+
| visitante | nuestra-ong.org | Y |
| visitante | % | Y |
+-----------+----------------------+----------------+
2 rows in set (0.00 sec)
Ahora solicitamos eliminar el privilegio select de todas las bases de datos y de todos los equipos en Internet.
mysql> revoke all
-> on *.*
-> from visitante@´%´;
Query OK, 0 rows affected (0.00 sec)
mysql> select user,host,select_priv from user
-> where user = ´visitante´;
+-----------+------------------+-------------+
| user | host | select_priv |
+-----------+------------------+-------------+
| visitante | nuestra-ong.org | Y |
| visitante | % | N |
+-----------+------------------+-------------+
2 rows in set (0.01 sec)
En la tabla user observamos que, efectivamente, se ha eliminado el privilegio para visitante@’%’ pero no para 'visitante@nuestra-ong.org'. MySQL considera que son direcciones diferentes y respeta los privilegios otorgados a uno cuando se modifica otro.