DROP USER

Cuando una cuenta de usuario ya no es necesaria, ya sea porque un empleado dejó la empresa, una aplicación fue retirada o simplemente se creó una cuenta de prueba temporal, debes eliminarla del servidor. La sentencia DROP USER elimina completamente una cuenta de usuario junto con todos sus privilegios. Es una acción definitiva que no puede deshacerse, por lo que conviene realizarla con precaución y siguiendo un proceso ordenado.

Mantener cuentas huérfanas en el servidor representa un riesgo de seguridad. Aunque el usuario no se conecte activamente, la cuenta sigue existiendo con sus credenciales y privilegios, y podría ser aprovechada por un atacante.

Sintaxis

La sintaxis de DROP USER es directa:

DROP USER [IF EXISTS] 'usuario'@'host';

También puedes eliminar múltiples usuarios en una sola sentencia:

DROP USER 'usuario1'@'host1', 'usuario2'@'host2';

Comportamiento básico

Cuando ejecutas DROP USER, MySQL elimina la cuenta de la tabla mysql.user y borra todas las entradas correspondientes en las tablas de privilegios (mysql.db, mysql.tables_priv, mysql.columns_priv, mysql.procs_priv). También elimina los roles asignados al usuario y cualquier rol por defecto configurado.

DROP USER 'temporal'@'localhost';

Si intentas eliminar un usuario que no existe, MySQL produce un error:

DROP USER 'inexistente'@'localhost';
-- ERROR 1396 (HY000): Operation DROP USER failed for 'inexistente'@'localhost'

Para evitar este error, especialmente en scripts automatizados, utiliza la cláusula IF EXISTS:

DROP USER IF EXISTS 'inexistente'@'localhost';
-- Query OK, 0 rows affected, 1 warning (0.01 sec)

Con IF EXISTS, MySQL emite un aviso en lugar de un error cuando el usuario no existe, lo que permite que el script continúe ejecutándose sin interrupciones.

Caso práctico: proceso ordenado de eliminación

Antes de eliminar un usuario, es recomendable seguir un proceso que documente sus privilegios actuales y asegure que no hay sesiones activas. Esto te permitirá recrear la cuenta rápidamente si la eliminación resulta ser un error.

Primero, documenta los privilegios del usuario:

SHOW GRANTS FOR 'exempleado'@'192.168.1.%';
Grants for exempleado@192.168.1.%
GRANT USAGE ON . TO exempleado@192.168.1.%
GRANT SELECT, INSERT, UPDATE ON ventas.* TO exempleado@192.168.1.%
GRANT rol_ventas@% TO exempleado@192.168.1.%

A continuación, verifica si el usuario tiene sesiones activas:

SELECT id, user, host, db, command, time
FROM information_schema.processlist
WHERE user = 'exempleado';
iduserhostdbcommandtime
142exempleado192.168.1.45:43210ventasSleep3600

Si hay sesiones activas, puedes terminarlas antes de eliminar la cuenta:

KILL 142;

Ahora sí, procede a eliminar el usuario:

DROP USER 'exempleado'@'192.168.1.%';

Verifica que la cuenta ya no existe:

SELECT user, host FROM mysql.user WHERE user = 'exempleado';

La consulta devuelve cero filas, confirmando que la cuenta fue eliminada por completo.

Caso práctico: sesiones activas después de DROP USER

Un detalle importante es que DROP USER no termina automáticamente las conexiones activas del usuario eliminado. Si el usuario tenía una sesión abierta en el momento de la eliminación, esa sesión seguirá funcionando con los privilegios que tenía hasta que se desconecte o hasta que ejecute una operación que requiera una nueva verificación de privilegios.

-- El usuario tiene una conexión activa
DROP USER 'consultor'@'%';
 
-- La sesión del consultor sigue funcionando temporalmente
-- Verificar sesiones que pertenecen al usuario eliminado
SELECT id, user, host, time
FROM information_schema.processlist
WHERE user = 'consultor';
iduserhosttime
205consultor10.0.1.30:45210120

Para garantizar que el usuario pierde acceso de inmediato, termina todas sus sesiones después de eliminarlo:

KILL 205;

Este paso es especialmente importante en entornos donde la seguridad es crítica, como cuando se revoca el acceso a un empleado que acaba de ser despedido.

Caso práctico: eliminación masiva de cuentas temporales

En entornos de desarrollo es común crear cuentas temporales para pruebas. Puedes eliminar varias a la vez:

DROP USER IF EXISTS
    'test_qa1'@'localhost',
    'test_qa2'@'localhost',
    'test_dev'@'%',
    'temp_import'@'localhost';

Si alguna de estas cuentas no existe, la cláusula IF EXISTS evita que la operación falle. MySQL reportará avisos para las cuentas que no encontró, pero completará la eliminación de las que sí existen.

Para identificar cuentas que podrían ser candidatas a eliminación, puedes buscar usuarios que no se han conectado recientemente consultando la tabla de rendimiento:

SELECT user, host,
       current_connections,
       total_connections
FROM performance_schema.accounts
WHERE user IS NOT NULL
  AND user NOT LIKE 'mysql.%'
  AND total_connections = 0
ORDER BY user;
userhostcurrent_connectionstotal_connections
cuenta_vieja%00
test_olvidadolocalhost00

Las cuentas con cero conexiones totales son fuertes candidatas a ser eliminadas, especialmente si no reconoces su propósito.

Advertencia: DROP USER es irreversible. Una vez eliminada la cuenta, la única forma de restaurarla es recrearla manualmente con CREATE USER y volver a asignar todos sus privilegios con GRANT. Por eso es fundamental documentar los privilegios antes de eliminar.

Consejo: En lugar de eliminar inmediatamente una cuenta que ya no se usa, considera primero bloquearla con ALTER USER ... ACCOUNT LOCK. Esto desactiva el acceso sin perder la configuración, dándote tiempo para confirmar que la eliminación es segura.

En el siguiente artículo aprenderás a renombrar usuarios con RENAME USER.

Escrito por Eduardo Lázaro