RENAME USER
A veces necesitas cambiar el nombre de una cuenta de usuario sin perder sus privilegios ni su configuración. Esto puede ocurrir cuando un empleado cambia de apellido, cuando quieres estandarizar la nomenclatura de las cuentas o cuando necesitas cambiar el host desde el que un usuario puede conectarse. La sentencia RENAME USER permite hacer estos cambios de forma atómica, preservando todos los privilegios asociados a la cuenta original.
La alternativa manual, que sería crear una cuenta nueva, copiar los privilegios y eliminar la antigua, es un proceso tedioso y propenso a errores. RENAME USER realiza todo esto en un solo paso.
Sintaxis
La sintaxis de RENAME USER es:
RENAME USER 'nombre_actual'@'host_actual'
TO 'nombre_nuevo'@'host_nuevo';También puedes renombrar varios usuarios en una sola sentencia:
RENAME USER
'usuario1'@'host1' TO 'nuevo1'@'host1',
'usuario2'@'host2' TO 'nuevo2'@'host2';Comportamiento básico
Cuando ejecutas RENAME USER, MySQL actualiza el nombre y/o host del usuario en todas las tablas de privilegios del sistema: mysql.user, mysql.db, mysql.tables_priv, mysql.columns_priv y mysql.procs_priv. Todos los privilegios, roles asignados y configuraciones de la cuenta se preservan intactos.
RENAME USER 'mgarcia'@'localhost' TO 'maria.garcia'@'localhost';Después de ejecutar esta sentencia, la cuenta mgarcia deja de existir y todos sus privilegios pertenecen ahora a maria.garcia. La contraseña también se conserva, por lo que el usuario puede conectarse inmediatamente con el nuevo nombre usando la misma contraseña.
Para verificar el resultado:
SHOW GRANTS FOR 'maria.garcia'@'localhost';| Grants for maria.garcia@localhost |
|---|
GRANT USAGE ON . TO maria.garcia@localhost |
GRANT SELECT, INSERT, UPDATE ON ventas.* TO maria.garcia@localhost |
Los privilegios que antes pertenecían a mgarcia ahora figuran bajo maria.garcia.
Caso práctico: cambiar el host de conexión
Uno de los usos más prácticos de RENAME USER es cambiar el host desde el que un usuario puede conectarse. Por ejemplo, cuando una aplicación se migra de un servidor a otro y necesitas actualizar la cuenta de servicio:
-- La aplicación se mudó de 10.0.1.15 a 10.0.2.30
RENAME USER 'webapp'@'10.0.1.15' TO 'webapp'@'10.0.2.30';Esto es más seguro y rápido que eliminar la cuenta antigua y crear una nueva, ya que todos los privilegios se preservan automáticamente.
También es útil cuando necesitas ampliar o restringir el acceso de red de un usuario:
-- Cambiar de acceso solo local a acceso desde toda la red interna
RENAME USER 'analista'@'localhost' TO 'analista'@'192.168.%';Después de este cambio, el usuario analista ya no podrá conectarse desde localhost directamente, pero sí desde cualquier máquina de la red 192.168.x.x. Si necesitas que funcione desde ambos, deberás mantener la cuenta original y crear una segunda cuenta para el nuevo host.
Caso práctico: estandarizar nombres de cuentas
En organizaciones que crecen rápidamente, es común encontrar cuentas con nomenclaturas inconsistentes. Algunos usuarios tienen nombres con iniciales, otros con nombres completos y otros con apodos. Puedes estandarizar todo en una sola operación:
RENAME USER
'jlopez'@'localhost' TO 'juan.lopez'@'localhost',
'mrodriguez'@'localhost' TO 'maria.rodriguez'@'localhost',
'admin1'@'%' TO 'dba.principal'@'%',
'pgarcia'@'192.168.1.%' TO 'pedro.garcia'@'192.168.1.%';Todas estas renombraciones se ejecutan como una operación atómica. Si alguna falla, por ejemplo porque el nombre destino ya existe, ninguna de las renombraciones se aplica. Esto garantiza la consistencia.
Antes de ejecutar un renombramiento masivo, verifica que los nombres destino no existan ya:
SELECT user, host
FROM mysql.user
WHERE user IN ('juan.lopez', 'maria.rodriguez', 'dba.principal', 'pedro.garcia');Si la consulta devuelve cero filas, es seguro proceder con el renombramiento.
Caso práctico: preservación completa de privilegios
Para demostrar que RENAME USER preserva absolutamente todos los privilegios, veamos un ejemplo completo. Supongamos que tienes un usuario con permisos en múltiples niveles:
-- Configuración original del usuario
CREATE USER 'dev_carlos'@'localhost' IDENTIFIED BY 'Carlos#Dev2024';
GRANT SELECT, INSERT ON proyecto_a.* TO 'dev_carlos'@'localhost';
GRANT SELECT ON proyecto_b.clientes TO 'dev_carlos'@'localhost';
GRANT EXECUTE ON proyecto_a.* TO 'dev_carlos'@'localhost';
GRANT 'rol_desarrollador' TO 'dev_carlos'@'localhost';
-- Verificar los privilegios antes del renombramiento
SHOW GRANTS FOR 'dev_carlos'@'localhost';| Grants for dev_carlos@localhost |
|---|
GRANT USAGE ON . TO dev_carlos@localhost |
GRANT SELECT, INSERT, EXECUTE ON proyecto_a.* TO dev_carlos@localhost |
GRANT SELECT ON proyecto_b.clientes TO dev_carlos@localhost |
GRANT rol_desarrollador@% TO dev_carlos@localhost |
Ahora ejecutamos el renombramiento:
RENAME USER 'dev_carlos'@'localhost' TO 'carlos.mendez'@'localhost';Y verificamos que todo se conservó:
SHOW GRANTS FOR 'carlos.mendez'@'localhost';| Grants for carlos.mendez@localhost |
|---|
GRANT USAGE ON . TO carlos.mendez@localhost |
GRANT SELECT, INSERT, EXECUTE ON proyecto_a.* TO carlos.mendez@localhost |
GRANT SELECT ON proyecto_b.clientes TO carlos.mendez@localhost |
GRANT rol_desarrollador@% TO carlos.mendez@localhost |
Cada privilegio, incluyendo los de nivel de tabla y el rol asignado, se ha transferido correctamente a la nueva identidad del usuario.
Advertencia: Si el usuario tiene sesiones activas en el momento del renombramiento, esas sesiones no se ven afectadas inmediatamente. Sin embargo, la próxima vez que intente conectarse deberá usar el nuevo nombre. Asegúrate de notificar al usuario o actualizar las configuraciones de conexión de la aplicación correspondiente.
Consejo:
RENAME USERfalla si el nombre destino ya existe. Si necesitas intercambiar los nombres de dos usuarios, deberás usar un nombre temporal intermedio. Por ejemplo: renombrar A a TEMP, luego B a A y finalmente TEMP a B.
En el siguiente artículo aprenderás a bloquear cuentas de usuario para desactivar el acceso temporalmente.
Escrito por Eduardo Lázaro
