今天上午平台上的一个用户从msn上用别扭的中文给我留言 让我帮忙在他们的测试mysql 里面建个用户 要一个 select 权限和show databases 权限,于是我就登陆服务器给他加了一个用户

 grant select on *.* to 'rockman'@'192.168.8.%' identified by 'uuYgnu09';

  一般情况下我如果给了 select权限以后这个用户用 show databases就可以看到所有数据库了,但是我错了那个用户没过多久就跟我反映说,用户可以登录了也可以select,但是show databases的时候提示我没有权限,我于是又确认了一下,确实不能用show databases,这是怎么回事。后来才发现在 my.cnf 里面有这么一条 skip-show-database 这样的话普通用户肯定不能用show databases的,只能再给他加上了一条 grant show databases on *.* to 'rockman'@'192.168.8.%' identified by 'uuYgnu09'; 这时再看mysql.user 表的 rockman 用户权限 Show_db_priv: Y

再测试了一下就好了。

  不过接下来我又做了个测试让我不免有些疑惑了,我在自己mysql 配置文件里面不加skip-show-database这个选项,进入mysql以后随便建了一个 xman 用户并给他select权限 grant select on *.* to 'xman'@'192.168.1.%' identified by 'ufo'; 并用xman登录以后 show databases; 确实没有问题而且一看 mysql.user 里面的xman 权限 竟然是 Show_db_priv: N 既然他没有 show db的权限为什么只有一个select权限却还能 show databases呢?

 我查看了一下mysql手册,里面是这样解释skip-show-database的

  With this option, the SHOW DATABASES statement is permitted only to users who have the SHOW DATABASES privilege, and the statement displays all database names. Without this option, SHOW DATABASES is permitted to all users, but displays each database name only if the user has the SHOW DATABASES privilege or some privilege for the database. Note that any global privilege is considered a privilege for the database.

  现在我明白了,原来如果不加这个选项所有的用户都可以 show databases的,只不过看到的只有自己有权限的库而已。如果 Show_db_priv: Y 的话估计就表示这个用户对所有数据库都有show databases权限了。