zaLinux.ru

Ошибка «ERROR 1143 (42000)»: command denied to user for column in table в MySQL (MariaDB) (РЕШЕНО)


Как исправить «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 читайте в статьях:


Рекомендуемые статьи:

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *