Mysql забывает, кто вошел в систему: команда запрещена пользователю '' @'%'

Запуск show grants; означает, что я зарегистрирован как пользователь со всеми привилегиями в базе данных.

Запуск show table status; приводит к ошибке. И ошибка не показывает имя пользователя, в котором я зарегистрирован как!

Как будто для этой команды mysql забывает, кто я. Другие операции выбора отлично работают. Может кто-нибудь объяснить это? Как исправить? Спасибо.

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.5.13-log Source distribution

Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show grants;
+---------------------------------------------------------------------------------------------------------------------+
| Grants for [email protected]                                                                                            |
+---------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'php'@'localhost' IDENTIFIED BY PASSWORD '*8F5FF90079BC601F8EA7C148475658E65A0C029D' |
| GRANT ALL PRIVILEGES ON `sunflower_work`.* TO 'php'@'localhost'                                                     |
| GRANT ALL PRIVILEGES ON `news_demo`.* TO 'php'@'localhost'                                                          |
| GRANT ALL PRIVILEGES ON `news_base`.* TO 'php'@'localhost'                                                          |
+---------------------------------------------------------------------------------------------------------------------+
4 rows in set (0.00 sec)

mysql> show table status from sunflower_work;
ERROR 1143 (42000): SELECT command denied to user ''@'%' for column 'uid' in table 'users'
mysql>

update... как было предложено Tomalak, я удалил пользователя и воссоздал его с полными привилегиями и без пароля. Тем не менее проблема сохраняется. Теперь это выглядит так:

mysql> show grants;
+--------------------------------------------------+
| Grants for [email protected]                         |
+--------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'php'@'localhost' |
+--------------------------------------------------+
1 row in set (0.00 sec)

mysql> show table status;
ERROR 1143 (42000): SELECT command denied to user ''@'%' for column 'uid' in table 'users'
mysql> 

Ответы

Ответ 1

Вероятно, проблема связана с наличием VIEWS в вашей базе данных. Мнения, вероятно, создаются с определенными правами.

Как вы можете сказать по вашему сообщению об ошибке, он жалуется на другого пользователя, кроме того, с которым вы вошли в систему. Это связано с тем, что для представления вы можете указать, как определить, какие права вид должен смотреть на данные.

Когда вы перейдете в свою базу данных, попробуйте ввести:

SHOW FULL TABLES IN sunflower_work WHERE TABLE_TYPE NOT LIKE '%table%';

Затем вы можете посмотреть права на определенные виды, которые есть.

Ответ 2

Ответы здесь помогли мне с моей конкретной проблемой. Большое спасибо! Вид был виновником, как описано выше.

Я попал в беду, потому что рассматриваемая база данных была создана из резервной копии удаленной базы данных, в которой были разные пользователи. "Прерванное" представление было "определено" пользователем, которого у меня не было локально. Даже root не смог выполнить аварийный запрос.

Изменил представление "DEFINER" на действительного локального пользователя, и проблема была решена!

ALTER 
DEFINER = 'a_valid_user'@'localhost' 
VIEW my_view
AS 
SELECT ..... 

Ознакомьтесь с документацией по ALTER VIEW для MySQL 5.5.

Большое спасибо еще раз!

Ответ 3

Сделайте резервную копию схемы, прежде чем продолжить.

Если вы только что импортировали файл дампа в MySQL, удалите этот импорт и связанную схему и начните снова.

откройте файл дампа в текстовом редакторе и удалите все строки со следующим содержимым /*! ~~~~ DEFINER = 'root' @'%' SQL SEFURITY DEFINER */

~ Представляет случайное число, сгенерированное верстаком во время экспорта

Это решение является быстрым решением и предназначено только для сред разработки.