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
DEFINER
gebruiker indien van toepassing; of, - Specificeer een andere
DEFINER
gebruiker bij het definiëren van het opgeslagen programma of de weergave... u kunt dit doen zolang u (de persoon die het object maakt) deSUPER
heeft privilege, en gebruikers die het object aanroepen (toegang krijgen tot) hebben tijdelijk de rechten van dieDEFINER
gebruiker in plaats daarvan; of, - Voeg
SQL SECURITY INVOKER
aan 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;
.