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
DEFINERBenutzer, falls zutreffend; oder, - Geben Sie einen anderen
DEFINERan Benutzer beim Definieren des gespeicherten Programms oder der Ansicht... Sie können dies tun, solange Sie (die Person, die das Objekt erstellt) denSUPERhaben Privileg, und Benutzer, die das Objekt aufrufen (auf es zugreifen), haben vorübergehend die Rechte diesesDEFINERBenutzer stattdessen; oder, - Fügen Sie
SQL SECURITY INVOKERhinzu 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; .