Как исправить «ERROR 1143 (42000)» в MySQL (MariaDB)
Ошибка с номерами 1143 (42000) возникает в тех случаях, когда у пользователя имеются привилегии на некоторые колонки таблицы, но он пытается выполнить свои привилегии для тех колонок, на которые у него нет разрешений.
Если пользователь пытается выполнить действия на которые у него нет привилегий ни на один столбец в таблице, то возникает ошибка с другим номером: 1142 (42000), «command denied to user for table».
Итак, если вы видите ошибку 1143 (42000), то её можно исправить указав в запросе только те столбцы, на которые у пользователя имеются привилегии. Если же вы получили ошибку 1142 (42000), то это означает, что пользователь пытается выполнить команду, но при этом у него нет привилегий ни на один столбец.
Проще говоря, ошибку 1143 (42000) пользователь может исправить самостоятельно, а для разрешения ошибки 1142 (42000) необходимо предоставление дополнительных привилегий и сам пользователь уже не может это исправить.
Рассмотрим конкретные примеры.
Запрос
SELECT * FROM TestTABLE;
Вызывает ошибку:
ERROR 1143 (42000): SELECT command denied to user 'mial'@'localhost' for column 'id' in table 'TestTABLE'
В самой ошибке уже сказано, что у пользователя нет привилегии SELECT на колонку «id».
Как узнать, какие привилегии и на какие столбцы имеются привилегии у пользователя в MySQL (MariaDB)
Чтобы узнать, к каким столбцам в определённой таблице пользователь имеет право доступа, выполните команду вида (замените _TestTABLE_ на название интересующей вас таблицы):
SHOW COLUMNS FROM _TestTABLE_;
В результате будут показаны только те столбцы, на которые пользователь имеет какие-либо привилегии.
Например:
SHOW COLUMNS FROM TestTABLE;
Результат выполнения запроса:
Показано только одно поле — «test_column», хотя мы знаем из сообщения ошибки, что в таблице также имеется поле «id». Вывод: на поле «test_column» у данного пользователя имеются привилегии, а на поле «id» привилегий нет.
Но какие именно привилегии имеются у пользователя на колонку «test_column»? Предыдущий запрос ответить на это не может.
Чтобы проверить, какими привилегиями на чтение и изменение таблиц и колонок обладает пользователь выполните следующий запрос (замените _USERNAME_ на имя пользователя):
SHOW GRANTS FOR '_USERNAME_'@'localhost';
Например:
SHOW GRANTS FOR 'mial'@'localhost';
Вся необходимая информация содержится в следующей строке:
GRANT SELECT (`test_column`), INSERT (`test_column`) ON `TestDB`.`TestTABLE` TO `mial`@`localhost`
Эта строка означает следующее:
- пользователь может выполнять запрос с выражением SELECT в отношении столбца «test_column», который принадлежит таблице TestTABLE, которая находится в базе данных TestDB
- пользователь может выполнять запрос с выражением INSERT в отношении столбца «test_column», который принадлежит таблице TestTABLE, которая находится в базе данных TestDB
Как выполнить запрос, если у пользователя имеется доступ только к определённым колонкам таблицы в MySQL (MariaDB)
Как мы помним, следующий запрос вызывает ошибку, поскольку пользователь пытается вывести содержимое всех столбцов:
SELECT * FROM TestTABLE;
Вместо «*» (звёздочка) укажите столбец, на который у пользователя имеется привилегия SELECT. Например:
SELECT test_column FROM TestTABLE;
Если имеются привилегии на несколько столбцов, то перечислите их через запятую, например:
SELECT test_column1, test_column2, test_column3 FROM TestTABLE;
Также у пользователя имеется привилегия INSERT, но только на один столбец «test_column». Попробуем вставить новые данные в таблицу:
INSERT INTO TestTABLE (`id`, `test_column`) VALUES ("4", "more data");
Получаем ошибку:
ERROR 1143 (42000): INSERT command denied to user 'mial'@'localhost' for column 'id' in table 'TestTABLE'
У пользователя нет привилегии INSERT на столбец «id». Поэтому изменим наш запрос:
INSERT INTO TestTABLE (`test_column`) VALUES ("more data");
Как можно увидеть на скриншоте, запрос выполнен успешно.
Проверим, действительно ли данные вставлены в таблице:
SELECT test_column FROM TestTABLE;
Да, новые данные добавлены в столбец, на который у пользователя имеется привилегия INSERT.
Заключение
Итак, для каждого пользователя MySQL и MariaDB можно индивидуально настроить права доступа к базам данных. В том числе ограничив его привилегии только просмотром определённых столбцов. Либо вы можете предоставить пользователю добавлять и изменять данные только в определённых таблицах и столбцах.
Подробности о филигранной настройки прав доступа пользователей MySQL и MariaDB читайте в статьях:
- Как разрешить пользователю доступ только к определённым базам данных в MySQL (MariaDB)
- Как разрешить доступ пользователю только к определённым таблицам в MySQL (MariaDB)
- Как разрешить доступ пользователю только к определённым столбцам в MySQL (MariaDB)
Связанные статьи:
- Ошибка «ERROR 1044 (42000): Access denied for user 'mial'@'localhost' to database 'TestDB'». Не удаётся создать базу данных MySQL (РЕШЕНО) (100%)
- Ошибка при использовании выражений USE в MySQL (MariaDB): «ERROR 1044 (42000): Access denied for user» (РЕШЕНО) (100%)
- Почему «mysql -h» не показывает справку. Ошибка «option '-h' requires an argument» (РЕШЕНО) (100%)
- Почему MySQL (MariaDB) запрашивает пароль, даже если он указан с опцией «-p» (РЕШЕНО) (100%)
- Ошибка «ERROR 1142 (42000)»: command denied to user for table в MySQL (MariaDB) (РЕШЕНО) (100%)
- Как установить Nginx, MySQL, PHP в Ubuntu 16.10 или 17.04 (RANDOM - 9.6%)