Table of Contents
Cómo crear usuarios en MySQL con validaciones y errores personalizados (ejemplo práctico)
En este tutorial aprenderás a crear un procedimiento almacenado en MySQL que permite generar usuarios de forma segura.
El procedimiento incluye:
✅ Validaciones con expresiones regulares para evitar caracteres no permitidos.
✅ Manejo de errores personalizados mediante SIGNAL SQLSTATE.
✅ Creación dinámica del usuario con PREPARE y EXECUTE.
✅ Comprobación previa para evitar duplicados en la tabla de usuarios de MySQL.
1. Usar la base de datos
Aunque el usuario no se crea dentro de una base de datos específica, trabajaremos en tiendaonline como ejemplo:
USE tiendaonline;
2. Eliminar el procedimiento si ya existe
DROP PROCEDURE IF EXISTS crearUsuario;
3. Crear el procedimiento crearUsuario
Aquí está el procedimiento completo:
DELIMITER //
CREATE PROCEDURE crearUsuario(
IN p_nombre VARCHAR(30),
IN p_contrasena VARCHAR(30)
)
DETERMINISTIC
BEGIN
-- Validar caracteres no permitidos en el nombre de usuario
IF p_nombre REGEXP '[^a-zA-Z0-9_]' THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'El nombre de usuario contiene caracteres no permitidos';
END IF;
-- Validar que la contraseña no tenga espacios
IF p_contrasena REGEXP '[[:space:]]' THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'La contraseña no debe contener espacios';
END IF;
-- Verificar si el usuario ya existe
IF NOT EXISTS (
SELECT 1
FROM mysql.user
WHERE user = p_nombre AND host = '%'
) THEN
-- Construir sentencia CREATE USER de forma segura
SET @sentenciasql = CONCAT(
'CREATE USER \'', REPLACE(p_nombre, '''', ''''''),
'\'@\'%\' IDENTIFIED BY \'', REPLACE(p_contrasena, '''', ''''''), '\''
);
-- Preparar y ejecutar el comando dinámico
PREPARE comandoDinamico FROM @sentenciasql;
EXECUTE comandoDinamico;
DEALLOCATE PREPARE comandoDinamico;
ELSE
-- Error personalizado si el usuario ya existe
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'El usuario ya existe en la base de datos';
END IF;
END //
DELIMITER ;
4. Ejecutar el procedimiento
Creamos un usuario nuevo, por ejemplo Juan con la contraseña 12345:
CALL crearUsuario('Juan','12345');
5. Verificar si el usuario fue creado correctamente
SELECT user, host
FROM mysql.user
WHERE user = 'Juan';
6. Prueba de error personalizado
Si intentas volver a ejecutar el procedimiento con el mismo usuario:
CALL crearUsuario('Juan','12345');
Obtendrás el siguiente error personalizado:
ERROR 1644 (45000): El usuario ya existe en la base de datos
Con este procedimiento almacenado logras:
- Crear usuarios en MySQL de forma controlada.
- Evitar errores comunes de seguridad (caracteres especiales, contraseñas con espacios).
- Lanzar mensajes personalizados para el usuario final.
- Asegurar que no se creen duplicados en la tabla de usuarios.
Es una forma mucho más profesional y segura de manejar cuentas en MySQL que hacerlo manualmente con CREATE USER.

GRANT ALL PRIVILEGES ON tiendaonline.* TO 'Juan'@'%';



Preguntas frecuentes (FAQ)
1. ¿Por qué usar expresiones regulares para validar?
Porque permiten restringir los caracteres que puede contener el nombre de usuario y la contraseña. Así se evitan inyecciones SQL o errores de formato.
2. ¿Qué hace SIGNAL SQLSTATE '45000'?
Permite lanzar un error personalizado con un mensaje definido por el programador.
3. ¿Por qué se usa PREPARE y EXECUTE?
Porque MySQL no permite concatenar directamente cadenas dinámicas en comandos como CREATE USER. Con PREPARE se construye y ejecuta de manera segura.
4. ¿Qué pasa si quiero que el host sea diferente a %?
Puedes cambiar '%’ por otro valor, como 'localhost', o incluso recibirlo como parámetro en el procedimiento.
5. ¿Puedo añadir permisos al usuario creado?
Sí. Después de crearlo, puedes ejecutar dentro del mismo procedimiento:
Te puede interesar:
Seguir leyendo:






