Ja, designmässigt kan en markör bete sig annorlunda än samma SELECT
frågan kan fungera om den kördes av användaren som anropade proceduren.
Om du inte anger en DEFINER
när du skapar ett lagrat program (proc, funktion, trigger eller händelse) eller en vy, körs objektet, när det nås, med privilegierna för användaren som ursprungligen definierade det, inte användaren som anropade det.
Du har tre alternativ här:
- Verifiera eller eventuellt ändra behörigheterna för den nuvarande
DEFINER
användare om lämpligt; eller, - Ange en annan
DEFINER
användare när du definierar det lagrade programmet eller vyn... du kan göra detta så länge du (personen som skapar objektet) harSUPER
privilegium och användare som anropar (åtkomst till) objektet kommer tillfälligt att ha rättigheterna till denDEFINER
användare istället; eller, - Lägg till
SQL SECURITY INVOKER
till definitionen av procedurer, funktioner och vyer (men inte utlösare eller händelser), vilket gör att objektet körs med privilegierna för användaren som anropade det, istället för definieraren, vilket är standardbeteendet.
För att se de behörigheter den befintliga definieraren har, till exempel om du ser DEFINER=`someguy`@`localhost`:
mysql> SHOW GRANTS FOR 'someguy'@'localhost';
Du kan hitta den aktuella definieraren i definitionen av proceduren, med SHOW CREATE PROCEDURE procedure_name;
.