Problemas con la creación de una función MySQL

Tengo esta función que no consigo crearla, siempre da el mismo error.

DELIMITER $$
DROP FUNCTION IF EXISTS crea_db_usuario$$
CREATE FUNCTION crea_db_usuario(id INT (10)) RETURNS VARCHAR(20) 
BEGIN
  DECLARE nombre VARCHAR(20) DEFAULT '';
  SET nombre = CONCAT('db_master_', id_usuario);
  CREATE DATABASE nombre;
    COMMIT;
END$$
DELIMITER ;

Error Code: 1422
Explicit or implicit commit is not allowed in stored function or trigger.

Necesito crear una DATABASE, crear usuario y asignar permisos a éste usuario con la DATABASE

Respuesta
1

La solución que he encontrado.

En la creación de PROCEDURES y FUNCIONES no se puede ejecutar un comando pasando variables tipo "nombre" como dato del nombre de la variable.

Sólo se puede crear un CONCAT para enlazar parte de la sentencia a una variable y después usar PREPARE para preparar la sentencia y finalmente EXECUTE para ejecutar ésta:

DECLARE nombre_db VARCHAR(20);
DECLARE nombre_user VARCHAR(20);
DECLARE pass_user VARCHAR(20);
SET nombre_db = CONCAT('db_master_',id_usuario);
SET nombre_user = CONCAT('user_master_',id_usuario);
SET pass_user = CONCAT('pass_master_',id_usuario);
SET @comando = CONCAT('CREATE DATABASE ',nombre_db,' DEFAULT CHARACTER SET utf8');
PREPARE stmt1 FROM @comando; 
EXECUTE stmt1;
/* Creamos usuario */
SET @comando = CONCAT("CREATE USER '",nombre_user,"'@'%' IDENTIFIED BY '",pass_user,"'");
PREPARE stmt1 FROM @comando; 
EXECUTE stmt1;
SET @comando = CONCAT("GRANT ALL ON  ",nombre_db,".* TO '",nombre_user,"'@'%' IDENTIFIED BY '",pass_user,"'");
PREPARE stmt1 FROM @comando; 
EXECUTE stmt1;

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas