Sim, por design, um cursor pode se comportar de maneira diferente do mesmo
SELECT query poderia se comportar se fosse executada pelo usuário que chamou o procedimento. Se você não especificar um
DEFINER quando você cria um programa armazenado (proc, função, gatilho ou evento) ou uma visualização, o objeto, quando acessado, é executado com os privilégios do usuário que o definiu originalmente, não do usuário que o invocou. Você tem três opções, aqui:
- Verifique ou possivelmente modifique as permissões do
DEFINERatual usuário, se apropriado; ou, - Especifique um
DEFINERdiferente usuário ao definir o programa ou visualização armazenado... você pode fazer isso desde que você (a pessoa que cria o objeto) tenha oSUPERprivilégio, e os usuários que invocam (acessam) o objeto terão temporariamente os direitos desseDEFINERusuário em vez disso; ou, - Adicionar
SQL SECURITY INVOKERpara a definição de procedimentos, funções e visualizações (embora não gatilhos ou eventos), fazendo com que o objeto seja executado com os privilégios do usuário que o invocou, em vez do definidor, que é o comportamento padrão.
Para ver as permissões que o definidor existente tem, por exemplo, se você ver DEFINER=`someguy`@`localhost`:
mysql> SHOW GRANTS FOR 'someguy'@'localhost';
Você pode encontrar o definidor atual na definição do procedimento, com
SHOW CREATE PROCEDURE procedure_name; .