Управление пользовательскими учетными записями
Отмена привилегий и удаление пользователей
Для отмены привилегий пользователя применяется оператор revoke. Его синтаксис очень похож на синтаксис оператора GRANT с той лишь разницей, что предложение ТО заменено на предложение FROM, а предложения IDENTIFIED BY и WITH GRANT OPTION отсутствуют вовсе:
REVOKE privileges (columns) ON what FROM user
Часть user этого оператора должна соответствовать части user исходного оператора GRANT для пользователя, привилегии которого отменяются. Часть privileges необязательно должна соответствовать ранее определенным привилегиям. Пользуясь оператором revoke, можно отменить только некоторые из привилегий, предоставленные оператором GRANT.
Оператор revoke применяется для отмены привилегий, но не для удаления пользователей. В таблице user все равно остается запись для пользователя, даже если все привилегии для него сняты. Это означает, что пользователь все еще имеет возможность подключаться к серверу. Для полного удаления пользователя необходимо явным образом удалить его запись из таблицы user. Для этих целей применяется оператор DELETE:
% mysql -u root mysql mysql> DELETE FROM user WHERE User = "user_name" and Host = "host_name"; mysql> FLUSH PRIVILEGES;
Оператор delete удаляет запись пользователя, а оператор FLUSH указывает серверу перезагрузить таблицы разрешений. (Таблицы перезагружаются автоматически при использовании операторов GRANT и revoke. Однако этого не происходит при непосредственном изменении таблиц разрешений.) Из описанной в следующем разделе ситуации вы узнаете, почему иногда лучше отказаться от удаления записей таблицы user.
Головоломка с привилегиями
Довольно часто начинающие администраторы MySQL попадают в следующую весьма запутанную ситуацию. Пытаясь добавить в таблицу разрешений запись для пользователей, они используют в части имени компьютера общий формат, например:
GRANT ALL ON samp_db.* TO fred@%snake.net IDENTIFIED BY "cocoa"
Назначение этого оператора — разрешить пользователю fred подключаться к серверу с любого компьютера домена snake.net и предоставить ему все привилегии для работы с базой данных samp_db. В результате пользователь fred получает возможность подключиться с любого компьютера, кроме сервера. Попытка подключиться с сервера завершается выводом сообщения об отклонении доступа даже при предоставлении правильного пароля.
Такая ситуация возникает, если в таблице разрешений содержатся записи, по умолчанию инсталлированные сценарием инициализации mysql_install_db. Причина ее возникновения в том, что при попытке подключения пользователя fred к серверу большим приоритетом перед записью этого пользователя обладает одна из записей анонимного пользователя. Согласно этой записи, для подключения пароль не нужен, однако пользователь fred пытается его ввести. Важно заметить, что для устранения этой проблемы достаточно удалить запись анонимного пользователя из таблицы user. Оператор revoke для этих целей не подходит, поскольку он отменяет только привилегии. Удаление записи выполняется с помощью следующих команд:
% mysql -u root mysql mysql> DELETE FROM user where User=""; mysql> FLUSH PRIVILEGES;
Сразу после удаления пользователь fred сможет успешно подключиться с локального компьютера.