【问题标题】:MySQL: Grant **all** privileges on databaseMySQL:授予对数据库的**所有**权限
【发布时间】:2011-06-28 08:09:43
【问题描述】:

我已经创建了数据库,例如“mydb”。

CREATE DATABASE mydb CHARACTER SET utf8 COLLATE utf8_bin;
CREATE USER 'myuser'@'%' IDENTIFIED BY PASSWORD '*HASH';
GRANT ALL ON mydb.* TO 'myuser'@'%';
GRANT ALL ON mydb TO 'myuser'@'%';
GRANT CREATE ON mydb TO 'myuser'@'%';
FLUSH PRIVILEGES;

现在我可以从任何地方登录数据库,但不能创建表。

如何授予对该数据库和(将来)表的所有权限。我无法在“mydb”数据库中创建表。我总是得到:

CREATE TABLE t (c CHAR(20) CHARACTER SET utf8 COLLATE utf8_bin);
ERROR 1142 (42000): CREATE command denied to user 'myuser'@'...' for table 't'

【问题讨论】:

  • 当您显示对 CURRENT_USER 的授权时会得到什么;
  • 只有在直接使用INSERTUPDATEDELETE等语句修改授权表时,才应使用FLUSH PRIVILEGES;

标签: mysql mariadb mysql-error-1142


【解决方案1】:
GRANT ALL PRIVILEGES ON mydb.* TO 'myuser'@'%' WITH GRANT OPTION;

这就是我创建“超级用户”权限的方式(尽管我通常会指定一个主机)。

重要提示

虽然这个答案可以解决访问问题,但WITH GRANT OPTION创建了一个可以edit the permissions of other users的MySQL用户。

GRANT OPTION 权限使您可以将您自己拥有的权限授予其他用户或从其他用户删除。

出于安全原因,您不应将此类用户帐户用于公众可以访问的任何流程(即网站)。建议您create a user with only database privileges用于这种用途。

【讨论】:

    【解决方案2】:

    这是一个老问题,但我认为接受的答案并不安全。创建超级用户很有用,但如果您想授予单个数据库的权限,则不好。

    grant all privileges on mydb.* to myuser@'%' identified by 'mypasswd';
    grant all privileges on mydb.* to myuser@localhost identified by 'mypasswd';
    

    % 似乎不包括套接字通信,localhost 是为了。 WITH GRANT OPTION只对超级用户有用,否则通常会有安全隐患。

    更新 MySQL 5.7+ 似乎这样警告:

    使用 GRANT 语句修改现有用户的其他属性 特权已被弃用,并将在未来的版本中删除。采用 此操作的 ALTER USER 语句。

    所以设置密码应该使用单独的命令。感谢@scary-wombat 的评论。

    ALTER USER 'myuser'@'%' IDENTIFIED BY 'mypassword';
    ALTER USER 'myuser'@'localhost' IDENTIFIED BY 'mypassword';
    

    希望这会有所帮助。

    【讨论】:

    • +1 表示不包括 WITH GRANT OPTION 并针对指定的数据库而不是全部 (*)。
    • 请注意,您可能不需要第一个命令,除非您想从外部 IP 地址或本地子网上的其他计算机访问。如果这样做,我建议使用针对您要允许的特定 IP 地址的命令,例如 myuser@192.168.0.1(用于本地子网上的一个),而不是一般的 myuser@%。
    • @EvanDonovan,这里有很多东西取决于用例和环境。例如 java 驱动程序根本不支持套接字传输 IIRC。但总的来说,我同意 - 最好尽可能指定特定 IP,或者仅在 127.0.0.1 上运行服务器,并在监听非本地主机时为服务器设置防火墙。
    【解决方案3】:

    这对某些人会有帮助:

    从 MySQL 命令行:

    CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password';
    

    遗憾的是,此时 newuser 没有权限对数据库进行任何操作。事实上,如果 newuser 甚至尝试登录(使用密码、密码),他们将无法访问 MySQL shell。

    因此,首先要做的是让用户能够访问他们需要的信息。

    GRANT ALL PRIVILEGES ON * . * TO 'newuser'@'localhost';
    

    此命令中的星号分别表示他们可以访问的数据库和表——此特定命令允许用户跨所有数据库和表读取、编辑、执行和执行所有任务。

    一旦您完成了要为新用户设置的权限,请务必重新加载所有权限。

    FLUSH PRIVILEGES;
    

    您的更改现在将生效。

    欲了解更多信息:http://dev.mysql.com/doc/refman/5.6/en/grant.html

    如果您对命令行不满意,可以使用 MySQL workbenchNavicatSQLyog 等客户端

    【讨论】:

    • flush privileges 使用grant 命令时不需要。 x4
    • 要么你从 Linode 批发复制,要么他们从你那里复制:linode.com/docs/databases/mysql/…
    • 我需要再次识别GRANT ALL PRIVILEGES ON * . * TO 'newuser'@'localhost' IDENTIFIED BY 'my_password' WITH GRANT OPTION;(奇怪...,但确实如此)
    【解决方案4】:

    您好,我使用此代码在 mysql 中拥有超级用户

    GRANT EXECUTE, PROCESS, SELECT, SHOW DATABASES, SHOW VIEW, ALTER, ALTER ROUTINE,
        CREATE, CREATE ROUTINE, CREATE TEMPORARY TABLES, CREATE VIEW, DELETE, DROP,
        EVENT, INDEX, INSERT, REFERENCES, TRIGGER, UPDATE, CREATE USER, FILE,
        LOCK TABLES, RELOAD, REPLICATION CLIENT, REPLICATION SLAVE, SHUTDOWN,
        SUPER
            ON *.* TO mysql@'%'
        WITH GRANT OPTION;
    

    然后

    FLUSH PRIVILEGES;
    

    【讨论】:

    • flush privileges 使用grant 命令时不需要。 x4
    • 注意:GRANT 中的确切列表因 MySQL 版本而异。
    【解决方案5】:

    此 SQL 授予所有数据库但仅授予基本权限。它们对于 Drupal 或 Wordpress 来说已经足够了,而且作为一个优点,它允许一个开发人员帐户用于本地项目。

    GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, 
        INDEX, ALTER, CREATE TEMPORARY TABLES 
    ON *.* TO 'username'@'localhost' IDENTIFIED BY 'password';
    

    【讨论】:

      【解决方案6】:
      GRANT ALL PRIVILEGES ON mydb.* TO myuser@localhost IDENTIFIED BY 'mypasswd';
      

      适用于架构上的特权:)

      可选:在mypasswd之后可以添加WITH GRANT OPTION

      【讨论】:

        【解决方案7】:

        仅从远程服务器访问 mydb 数据库

        GRANT ALL PRIVILEGES ON mydb.* TO 'root'@'192.168.2.21';
        

        从远程服务器访问所有数据库。

        GRANT ALL PRIVILEGES ON * . * TO 'root'@'192.168.2.21';
        

        【讨论】:

          【解决方案8】:

          我只能通过添加GRANT OPTION 使其工作,否则总是会收到权限被拒绝错误

          GRANT ALL PRIVILEGES ON mydb.* TO 'myuser'@'localhost' WITH GRANT OPTION;
          

          【讨论】:

            【解决方案9】:

             1. 创建数据库

            CREATE DATABASE db_name;
            

             2. 为数据库 db_name 创建用户名

            GRANT ALL PRIVILEGES ON db_name.* TO 'username'@'localhost' IDENTIFIED BY 'password';
            

             3. 使用数据库

            USE db_name;
            

             4. 最后你在数据库 db_name 中,然后执行 create 、 select 和 insert 操作等命令。

            【讨论】:

              【解决方案10】:

              要将数据库上的所有权限:mydb 授予用户:myuser,只需执行:

              GRANT ALL ON mydb.* TO 'myuser'@'localhost';
              

              或:

              GRANT ALL PRIVILEGES ON mydb.* TO 'myuser'@'localhost';
              

              PRIVILEGES 关键字不是必需的。

              我也不知道为什么其他答案建议将IDENTIFIED BY 'password' 放在命令的末尾。我认为这不是必需的。

              【讨论】:

                【解决方案11】:

                我在开发 MySQL Ver 8.0.21

                时遇到了这个挑战

                我想将名为my_app_db 的数据库的权限授予在localhost 主机上运行的root 用户。

                但是当我运行命令时:

                use my_app_db;
                
                GRANT ALL PRIVILEGES ON my_app_db.* TO 'root'@'localhost';
                

                我得到错误:

                ERROR 1064 (42000):您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 'my_app_db.* TO 'root'@'localhost'' 附近使用正确的语法>

                这是我修复的方法

                登录您的 MySQL 控制台。您可以将root 更改为您要登录的用户

                mysql -u root -p
                

                输入您的 mysql 根密码

                接下来,列出 MySQL 服务器上的所有用户及其主机。与 PostgreSQL 不同,这通常存储在 mysql 数据库中。所以我们需要先选择mysql数据库:

                use mysql;
                SELECT user, host FROM user;
                

                注意:如果您不运行use mysql,则会收到no database selected 错误。

                这应该会给你这样的输出:

                +------------------+-----------+
                | user             | host      |
                +------------------+-----------+
                | mysql.infoschema | localhost |
                | mysql.session    | localhost |
                | mysql.sys        | localhost |
                | root             | localhost |
                +------------------+-----------+
                4 rows in set (0.00 sec)
                

                接下来,根据从列表中获得的信息,将权限授予您想要的用户。在授予权限之前,我们需要先选择数据库。对我来说,我使用的是在localhost 主机上运行的root 用户:

                use my_app_db;
                GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost';
                

                注意GRANT ALL PRIVILEGES ON database_name.* TO 'root'@'localhost'; 命令可能不适用于现代版本的 MySQL。选择要使用的数据库后,大多数现代版本的 MySQL 将 grantprivilege 命令中的 database_name 替换为 *

                然后您可以退出 MySQL 控制台:

                exit
                

                就是这样。

                我希望这会有所帮助

                【讨论】:

                  猜你喜欢
                  • 2014-08-16
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-04-24
                  相关资源
                  最近更新 更多