Ja, ein Cursor kann sich absichtlich anders verhalten als derselbe SELECT
Die Abfrage könnte sich verhalten, wenn sie von dem Benutzer ausgeführt würde, der die Prozedur aufgerufen hat.
Wenn Sie keinen DEFINER
angeben Wenn Sie ein gespeichertes Programm (Prozedur, Funktion, Trigger oder Ereignis) oder eine Ansicht erstellen, wird das Objekt beim Zugriff mit den Rechten des Benutzers ausgeführt, der es ursprünglich definiert hat, und nicht des Benutzers, der es aufgerufen hat.
Sie haben hier drei Möglichkeiten:
- Überprüfen oder ändern Sie möglicherweise die Berechtigungen des aktuellen
DEFINER
Benutzer, falls zutreffend; oder, - Geben Sie einen anderen
DEFINER
an Benutzer beim Definieren des gespeicherten Programms oder der Ansicht... Sie können dies tun, solange Sie (die Person, die das Objekt erstellt) denSUPER
haben Privileg, und Benutzer, die das Objekt aufrufen (auf es zugreifen), haben vorübergehend die Rechte diesesDEFINER
Benutzer stattdessen; oder, - Fügen Sie
SQL SECURITY INVOKER
hinzu zur Definition von Prozeduren, Funktionen und Ansichten (aber nicht von Triggern oder Ereignissen), wodurch das Objekt mit den Rechten des Benutzers ausgeführt wird, der es aufgerufen hat, anstatt mit dem Definierer, was das Standardverhalten ist.
Um die Berechtigungen zu sehen, die der vorhandene Definierer hat, zum Beispiel, wenn Sie DEFINER=`someguy`@`localhost`:
sehenmysql> SHOW GRANTS FOR 'someguy'@'localhost';
Den aktuellen Definierer finden Sie in der Definition der Prozedur mit SHOW CREATE PROCEDURE procedure_name;
.