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
DEFINER
atual usuário, se apropriado; ou, - Especifique um
DEFINER
diferente usuário ao definir o programa ou visualização armazenado... você pode fazer isso desde que você (a pessoa que cria o objeto) tenha oSUPER
privilégio, e os usuários que invocam (acessam) o objeto terão temporariamente os direitos desseDEFINER
usuário em vez disso; ou, - Adicionar
SQL SECURITY INVOKER
para 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;
.