MySQL идентифицира потребител както чрез потребителското име, така и чрез хоста. Когато MySQL извършва удостоверяване при влизане, MySQL първо търси име на хост, което е точно съвпадение. Ако не намери точно съвпадение, тогава търси хост, съдържащ '%' заместващ знак.
Когато извършихте GRANT ... TO [email protected]
, MySQL създаде нов потребител (без парола, защото нямаше IDENTIFIED BY
дадени в изявлението.
Тогава какво се случи, когато се опитахте да влезете като myuser
от localhost, mysqld се опита да намери запис, който съответства на 'myuser'@'localhost'
в таблицата mysql.user и го намери. И сесията получи привилегиите, присвоени на този потребител.
(За да бъда малко по-точен, mysqld всъщност не разглежда съдържанието на таблицата mysql.user, а това, което наистина гледа структурата в паметта, която е попълнена от таблицата, когато е създадена. Повторно изграждане на структурата на паметта се задейства от оператор GRANT, REVOKE или FLUSH PRIVILEGES.)
Какво се случваше ПРЕДИ да добавите този нов потребител, mysqld търсеше точно съвпадение на потребител и име на хост и не намери. Но намери запис със заместващия знак „%“, така че съвпадна с него, така че сесията получи всички привилегии, предоставени на потребителя „myuser'@'%".
Двамата потребители 'u'@'%'
и 'u'@'localhost'
са отделни и различни един от друг. Привилегиите трябва да се предоставят на всеки потребител поотделно. Всички привилегии, предоставени на 'u'@'%'
се прилага САМО за този потребител, а НЕ за 'u'@'localhost'
.