我有一个数据库表,我希望所有有效的MySQL用户都可以访问(它用于跟踪多个数据库中的一组特定统计信息)。 有没有办法做到这一点?
我知道你可以通配符主机,但你似乎不能通配用户名。 基本上,我想这样做:
REVOKE ALL PRIVILEGES ON `database`.`table` FROM ''@'%'; GRANT INSERT, UPDATE ON `database`.`table` TO ''@'%';
遍历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;"
UPDATE
正如我在下面的评论中所说的,你可以使用incron来监视/var/lib/mysql/mysql/user.MYI并在创build用户时运行上面的脚本。
安装incron并启动它:
# /etc/init.d/incrond start Starting Filesystem event daemon (incrond): [ OK ]
为mysql用户创buildincron表:
# incrontab -l -u mysql /var/lib/mysql/mysql/user.MYI IN_MODIFY,IN_CLOSE_WRITE /var/lib/mysql/update_privileges.sh
当您创build一个新的MySQL用户时,您将在/var/log/cron看到以下内容:
incrond[13084]: (mysql) CMD (/var/lib/mysql/update_privileges.sh)
新用户将被自动授予db.table INSERT, UPDATE权限:
+-----------------------------------------------------------------------------------------------------------+ | Grants for testuser@% | +-----------------------------------------------------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'testuser'@'%' IDENTIFIED BY PASSWORD '*' | | GRANT INSERT, UPDATE ON `db`.`table` TO 'testuser'@'%' | +-----------------------------------------------------------------------------------------------------------+
我想知道是否有办法让最新的MySQL用户授予这个权限,而不是为所有用户做。
MySQL不支持在mysql文档中的用户名中使用通配符,除了每次添加新用户时使用任何脚本添加额外的用户权限以外,没有办法。
实际上,没有任何用户指定的授权声明将授予访问匿名用户帐户,您将需要设置和使用匿名用户帐户的密码来访问表。
如果你想在脚本中使用它,我宁愿build议使用一个单独的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