Sì, in base alla progettazione, un cursore può comportarsi in modo diverso dallo stesso SELECT la query potrebbe comportarsi se fosse eseguita dall'utente che ha chiamato la procedura.
Se non specifichi un DEFINER quando crei un programma memorizzato (proc, funzione, trigger o evento) o una vista, l'oggetto, quando si accede, viene eseguito con i privilegi dell'utente che lo ha definito originariamente, non dell'utente che lo ha invocato.
Hai tre opzioni, qui:
- Verifica o eventualmente modifica i permessi del
DEFINERcorrente utente se del caso; o, - Specifica un
DEFINERdiverso utente quando si definisce il programma o la vista archiviati... è possibile farlo purché tu (la persona che crea l'oggetto) abbia ilSUPERprivilegio e gli utenti che invocano (accedono) all'oggetto avranno temporaneamente i diritti di quelDEFINERutente invece; o, - Aggiungi
SQL SECURITY INVOKERalla definizione di procedure, funzioni e viste (sebbene non trigger o eventi), facendo sì che l'oggetto venga eseguito con i privilegi dell'utente che lo ha invocato, invece del definer, che è il comportamento predefinito.
Per vedere le autorizzazioni che ha il definitore esistente, ad esempio se vedi DEFINER=`someguy`@`localhost`:
mysql> SHOW GRANTS FOR 'someguy'@'localhost';
Puoi trovare il definer corrente nella definizione della procedura, con SHOW CREATE PROCEDURE procedure_name; .