我已经创建了数据库,例如'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'

当前回答

我可以使它只通过添加GRANT OPTION工作,没有总是接收许可拒绝错误

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

其他回答

我在MySQL 8.0.21版本工作时遇到了这个挑战

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

但是当我运行命令时:

use my_app_db;

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

我得到了错误:

错误1064(42000):你有一个错误的SQL语法;查看MySQL服务器版本对应的手册,以获得使用'my_app_db附近的正确语法。*在第1行>到“root”@“localhost”

以下是我的解决方法:

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

mysql -u root -p

输入mysql root密码

接下来,列出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。*到“root”@“localhost”;命令可能不适用于现代版本的MySQL。大多数现代版本的mysql在选择要使用的数据库后,在grant privileges命令中将database_name替换为*。

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

exit

就是这样。

我希望这对你们有帮助

这是一个老问题,但我不认为公认的答案是安全的。它适合创建超级用户,但不适合在单个数据库上授予特权。

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

%似乎不包括套接字通信,这是本地主机的目的。WITH GRANT OPTION仅适用于超级用户,否则通常存在安全风险。

MySQL 5.7+的更新提示如下:

使用GRANT语句修改现有用户的属性 Privileges已弃用,将在未来的版本中删除。使用 ALTER USER语句用于此操作。

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

ALTER USER 'myuser'@'%' IDENTIFIED BY 'mypassword';
ALTER USER 'myuser'@'localhost' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON mydb.* TO 'myuser'@'%' WITH GRANT OPTION;

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

重要提示

虽然这个答案可以解决访问问题,但WITH GRANT OPTION创建一个MySQL用户,可以编辑其他用户的权限。

GRANT OPTION特权使您能够向其他用户授予或从其他用户删除您自己拥有的特权。

出于安全原因,您不应将这种类型的用户帐户用于公众将有权访问的任何进程(即网站)。建议您创建一个仅具有数据库权限的用户用于这种用途。

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

适用于schema上的特权:)

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

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

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

or:

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

PRIVILEGES关键字不是必需的。

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