У меня есть таблица базы данных, к которой я хочу, чтобы все действующие пользователи MySQL имели доступ (она предназначена для отслеживания определенного набора статистики по нескольким базам данных). Есть ли способ сделать это?
Я знаю, что вы можете использовать подстановочные знаки для хостов, но, похоже, вы не можете использовать подстановочные знаки для имен пользователей. По сути, я хочу это сделать:
REVOKE ALL PRIVILEGES ON `database`.`table` FROM ''@'%';
GRANT INSERT, UPDATE ON `database`.`table` TO ''@'%';
MySQL не поддерживает подстановочные знаки в именах пользователей в соответствии с документами mysql, и нет другого способа, кроме использования любого скрипта, для добавления дополнительных привилегий пользователя каждый раз, когда вы добавляете нового пользователя.
Фактически, оператор grant без указания пользователя предоставит доступ к учетной записи анонимного пользователя, и вам нужно будет установить и использовать пароль для учетной записи анонимного пользователя для доступа к таблице.
Если вы пытаетесь использовать это в сценарии, я бы предпочел использовать отдельного пользователя mysql для сбора информации из этой таблицы, а не предоставлять привилегии и использовать индивидуальные учетные данные пользователя mysql.
Ссылки:
http://dev.mysql.com/doc/refman/5.1/en/grant.html#grant-table-privileges
http://dev.mysql.com/doc/refman/5.5/en/default-privileges.html
Прокрутите всех пользователей MySQL в mysql.user
table и предоставьте привилегии, которые вы хотите:
mysql --skip-column-names -e "select user,host from mysql.user where host='%';" \
| grep -v root | \
while read account; do
mysql -e "revoke all privileges on db.table from \
'`echo $account | awk '{ print $1 }'`'@'%';"
mysql -e "grant insert, update on db.table to \
'`echo $account | awk '{ print $1 }'`'@'%';"
done
mysql -e "flush privileges;"
ОБНОВИТЬ
Как я уже сказал в комментарии ниже, вы можете использовать Incron контролировать /var/lib/mysql/mysql/user.MYI
и запускать указанный выше сценарий всякий раз, когда создается пользователь.
Установите incron и запустите его:
# /etc/init.d/incrond start
Starting Filesystem event daemon (incrond): [ OK ]
Создать таблицу incron для mysql
пользователь:
# incrontab -l -u mysql
/var/lib/mysql/mysql/user.MYI IN_MODIFY,IN_CLOSE_WRITE /var/lib/mysql/update_privileges.sh
Когда вы создаете нового пользователя MySQL, вы увидите ниже в /var/log/cron
:
incrond[13084]: (mysql) CMD (/var/lib/mysql/update_privileges.sh)
и новому пользователю будет автоматически предоставлено INSERT, UPDATE
привилегии на db.table
:
+-----------------------------------------------------------------------------------------------------------+
| Grants for testuser@% |
+-----------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'testuser'@'%' IDENTIFIED BY PASSWORD '*' |
| GRANT INSERT, UPDATE ON `db`.`table` TO 'testuser'@'%' |
+-----------------------------------------------------------------------------------------------------------+
Интересно, есть ли способ получить последнего пользователя MySQL и предоставить ему привилегии вместо того, чтобы делать это для всех пользователей.