Sí, por diseño, un cursor puede comportarse de manera diferente al mismo SELECT la consulta podría comportarse si fuera ejecutada por el usuario que llamó al procedimiento.
Si no especifica un DEFINER cuando crea un programa almacenado (proc, función, activador o evento) o una vista, el objeto, cuando se accede a él, se ejecuta con los privilegios del usuario que lo definió originalmente, no del usuario que lo invocó.
Tienes tres opciones, aquí:
- Verificar o posiblemente modificar los permisos del
DEFINERactual usuario si corresponde; o, - Especifique un
DEFINERdiferente usuario al definir el programa almacenado o la vista... puede hacerlo siempre que usted (la persona que crea el objeto) tenga elSUPERprivilegio, y los usuarios que invocan (acceden) al objeto tendrán temporalmente los derechos de eseDEFINERusuario en su lugar; o, - Añadir
SQL SECURITY INVOKERa la definición de procedimientos, funciones y vistas (aunque no disparadores ni eventos), lo que hace que el objeto se ejecute con los privilegios del usuario que lo invocó, en lugar del definidor, que es el comportamiento predeterminado.
Para ver los permisos que tiene el definidor existente, por ejemplo, si ve DEFINER=`someguy`@`localhost`:
mysql> SHOW GRANTS FOR 'someguy'@'localhost';
Puede encontrar el definidor actual en la definición del procedimiento, con SHOW CREATE PROCEDURE procedure_name; .