Oui, de par sa conception, un curseur peut se comporter différemment du même SELECT
la requête pourrait se comporter si elle était exécutée par l'utilisateur qui a appelé la procédure.
Si vous ne spécifiez pas de DEFINER
lorsque vous créez un programme stocké (proc, fonction, déclencheur ou événement) ou une vue, l'objet, lorsqu'il est accédé, s'exécute avec les privilèges de l'utilisateur qui l'a défini à l'origine, et non de l'utilisateur qui l'a appelé.
Vous avez trois options, ici :
- Vérifier ou éventuellement modifier les permissions du
DEFINER
actuel utilisateur le cas échéant ; ou, - Spécifiez un autre
DEFINER
utilisateur lors de la définition du programme ou de la vue stockée... vous pouvez le faire tant que vous (la personne créant l'objet) avez leSUPER
privilège, et les utilisateurs invoquant (accédant) à l'objet auront temporairement les droits de ceDEFINER
utilisateur à la place ; ou, - Ajouter
SQL SECURITY INVOKER
à la définition des procédures, des fonctions et des vues (mais pas des déclencheurs ou des événements), provoquant l'exécution de l'objet avec les privilèges de l'utilisateur qui l'a appelé, au lieu du définisseur, qui est le comportement par défaut.
Pour voir les autorisations dont dispose le définisseur existant, par exemple si vous voyez DEFINER=`someguy`@`localhost` :
mysql> SHOW GRANTS FOR 'someguy'@'localhost';
Vous pouvez trouver le définisseur courant dans la définition de la procédure, avec SHOW CREATE PROCEDURE procedure_name;
.