Пользователи и их права в MySQL на примерах

Написано 2 Июнь, 2011 в категории MySQL,Wordpress,Разработка ПО

1. Создаем пользователя.

 mysql> CREATE USER 'stasyak'@'localhost';

2. Задаем пароль для данного пользователя.

 mysql> SET PASSWORD FOR 'stasyak'@'localhost' = PASSWORD("pa1SS2WORD");

3. Даем права пользователю.

 mysql> GRANT ALL ON wordpress.* TO 'stasyak'@'localhost';

Итог: мы создали пользователя stasyak для сервера с именем localhost, затем установили для него пароль pa1SS2WORD, затем дали возможность этому пользователю видеть и редактировать таблицы базы данных wordpress.

Люди, хорошо знакомые с mysql заметят, что это не самый короткий путь создания пользователя с определенными правами. Согласен, есть более короткий вариант:

mysql> GRANT ALL PRIVILEGES ON wordpress.* TO 'stasyak'@'localhost' IDENTIFIED BY 'secret';

Разница между длинным и коротким вариантами в том, что команда GRANT работает "тихо", т.е. если пользователя нет, то она создаст его и установит ему пароль и права, но если пользователь есть, то GRANT просто сменит у него пароль и права. Какие же проблемы это может доставить? Представьте, что под mysql работают более дюжины разных сайтов с разными базами, при установке нового сайта, ему создается своя база и свой пользователь. Вездесущий человеческий фактор может привести к тому, что при попытке создать нового (как мы предполагаем) пользователя с помощью команды GRANT мы затрем пароль и права старого пользователя. И что самое страшное даже этого не заметим. Придирчивый читатель может указать на методологическую ошибку - внимательный программист должен, во-первых, знать такую особенность mysql, а во-вторых проверить существование пользователя в базе с помощью команды

mysql> select User from mysql.user

В жизни же получается, что даже самые внимательные из нас теряют бдительность. Наверное "золотой" серединой будет такая последовательность:
1. Создаем пользователя.

 mysql> CREATE USER 'stasyak'@'localhost';

Если такой пользователь уже существует, то MySQL поругается на вас вот в таких выражениях:

 mysql> create user 'stasyak'@'localhost';
ERROR 1396 (HY000): Operation CREATE USER failed for 'stasyak'@'localhost'

Ошибка не очень информативная, к сожалению. Об этом, кажется, сожалею не только я
http://bugs.mysql.com/bug.php?id=28331 :)
2. Даем права пользователю и устанавливаем пароль.

 mysql> GRANT ALL ON wordpress.* TO 'stasyak'@'localhost' IDENTIFIED BY 'secret';

Приятного программирования и поменьше ошибок!