为什么MySQL中的GRANT命令无法正常工作?

56

我被这个问题困扰了很久,因为我看到很多帮助网站上都展示了如何创建MySQL用户并授予权限,但不知为何对我就是不起作用。我在安装了最新版本的MySQL的WinXP和MacBook Pro笔记本上都尝试过。

以下仅是我使用WordPress时的一个示例。实际数据库是不同的,但问题相同。

下面是步骤:

mysql> mysql -uroot -p<password>
mysql> CREATE DATABASE wwordpress;
mysql> CREATE USER 'www'@'localhost' IDENTIFIED BY 'basic';

查询成功,影响0行 (0.14秒)

mysql> GRANT INSERT ON wordpress.* TO 'www'@'localhost' IDENTIFIED BY 'basic';

查询OK,受影响的行数为0(0.00秒)

mysql> FLUSH PRIVILEGES;

查询成功,0行受到影响(用时0.03秒)

mysql> SELECT * FROM mysql.user WHERE User='www' \G
*************************** 1. row ***************************
                 Host: localhost
                 User: www
             Password: *E85C94AF0F09C892339D31CF7570A970BCDC5805
          Select_priv: N
          Insert_priv: N
          Update_priv: N
          Delete_priv: N
          Create_priv: N
            Drop_priv: N
          Reload_priv: N
        Shutdown_priv: N
         Process_priv: N
            File_priv: N
           Grant_priv: N
      References_priv: N
           Index_priv: N
           Alter_priv: N
         Show_db_priv: N
           Super_priv: N
Create_tmp_table_priv: N
     Lock_tables_priv: N
         Execute_priv: N
      Repl_slave_priv: N
     Repl_client_priv: N
     Create_view_priv: N
       Show_view_priv: N
  Create_routine_priv: N
   Alter_routine_priv: N
     Create_user_priv: N
           Event_priv: N
         Trigger_priv: N
             ssl_type:
           ssl_cipher:
          x509_issuer:
         x509_subject:
        max_questions: 0
          max_updates: 0
      max_connections: 0
 max_user_connections: 0
1 row in set (0.00 sec)
mysql>

如您所见,“Insert_priv: N” 应该为“Y”。

有什么建议吗?

谢谢提前。

5个回答

53
你选择的是全局权限,但你正在授予特定数据库(和主机,但这不重要)的权限。
GRANT INSERT ON wordpress.* TO 'www'@'localhost' IDENTIFIED BY 'basic';
这些权限存储在“db”表中。
仅为指向正确方向而言:
SHOW GRANTS FOR 'www'@'localhost'

http://dev.mysql.com/doc/refman/5.0/en/show-grants.html


16

那不是存储大多数用户授予的权限的位置 - 请尝试

SHOW GRANTS FOR 'www'@'localhost'

要查看特定于数据库的权限,请参见。 (如果授予所有数据库,则授予仅会显示在用户表中。)

以下是MySQL中权限如何存储的(相当陈旧的)逐步详细说明-我认为事情并没有改变多少。


谢谢Martin。不过,我想知道这个表格是干什么用的?我认为它们应该是一致的吧?这里有一个链接,其中之一显示字段应该是“Y”:http://kb.mediatemple.net/questions/788/HOWTO%3A+GRANT+privileges+in+MySQL - Christopher
看起来RTFM是这里的答案:http://dev.mysql.com/doc/refman/5.0/en/show-grants.html - Christopher
@Christopher - 我添加了一个链接,提供了一个详细的介绍,希望对你有帮助。 - martin clayton

3
这应该可以正常工作:
GRANT ALL PRIVILEGES ON database_name.* TO 'username'@'localhost';

我知道这只是一个例子,但它应该是database\_name。你需要转义下划线,因为数据库名称是模式匹配。 - Duncan

1
如果您需要选择 Y 或 N 来限制用户可以编辑、插入或删除哪个页面,您需要查看 mysql.db 或 mysql.tables_priv 表。这些表会自动更新 Y 和 N,因为它们的设计目的是显示用户在表或列上拥有的特权,而不是像 mysql.user 那样用于显示某个用户可以登录(创建连接)到数据库。

0

是的,我同意。我创建了两个用户并授予他们数据库的所有权限,但不知何故,只有一个用户将获得升级后的权限。无论我怎么做,第二个用户都无法获得权限,尽管我尝试以与第一个用户相同的方式授予权限,并在此之后刷新了权限。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接