Ja, door het ontwerp kan een cursor zich anders gedragen dan dezelfde SELECT query kan zich gedragen als deze wordt uitgevoerd door de gebruiker die de procedure heeft aangeroepen.
Als u geen DEFINER opgeeft wanneer u een opgeslagen programma (proc, functie, trigger of gebeurtenis) of een weergave maakt, wordt het object, wanneer het wordt geopend, uitgevoerd met de privileges van de gebruiker die het oorspronkelijk heeft gedefinieerd, niet de gebruiker die het heeft aangeroepen.
Je hebt hier drie opties:
- Controleer of wijzig eventueel de rechten van de huidige
DEFINERgebruiker indien van toepassing; of, - Specificeer een andere
DEFINERgebruiker bij het definiëren van het opgeslagen programma of de weergave... u kunt dit doen zolang u (de persoon die het object maakt) deSUPERheeft privilege, en gebruikers die het object aanroepen (toegang krijgen tot) hebben tijdelijk de rechten van dieDEFINERgebruiker in plaats daarvan; of, - Voeg
SQL SECURITY INVOKERaan de definitie van procedures, functies en weergaven (hoewel niet triggers of gebeurtenissen), waardoor het object wordt uitgevoerd met de privileges van de gebruiker die het heeft aangeroepen, in plaats van de definiëring, wat het standaardgedrag is.
Om de machtigingen te zien die de bestaande definitie heeft, bijvoorbeeld als u DEFINER=`someguy`@`localhost` ziet:
mysql> SHOW GRANTS FOR 'someguy'@'localhost';
U kunt de huidige definitie vinden in de definitie van de procedure, met SHOW CREATE PROCEDURE procedure_name; .