我有一个数据库表,希望所有有效的 MySQL 用户都可以访问它(它用于跟踪跨多个数据库的一组特定统计信息)。有办法吗?
我知道您可以使用通配符主机,但您似乎无法使用通配符用户名。本质上,我想这样做:
REVOKE ALL PRIVILEGES ON `database`.`table` FROM ''@'%';
GRANT INSERT, UPDATE ON `database`.`table` TO ''@'%';
答案1
循环遍历mysql.user
表中的所有 MySQL 用户并授予您想要的权限:
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;"
更新
正如我在下面的评论中所说,你可以使用因克龙/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 用户并为其授予权限,而不是为所有用户授予权限。
答案2
根据 mysql 文档,MySQL 不支持用户名中的通配符,并且除了每次添加新用户时使用任何脚本添加额外的用户权限之外,没有其他办法。
实际上,未指定任何用户的授权语句将授予匿名用户帐户的访问权限,并且您需要设置并使用匿名用户帐户的密码来访问该表。
如果您尝试在脚本中使用它,我建议使用单独的 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