MySQL 8.0.18 角色对数据库的所有权限不允许用户创建数据库

MySQL 8.0.18 all privileges on a database for role doesn't allow user to create the database

我使用角色为我的 MySQL 用户提供资助。我注意到一个奇怪的行为,在向用户授予角色时我无法在任何地方找到记录。让我带您一探究竟。

首先,我们创建一个实际用户 joe@localhost 并授予它对 joe_db所有 权限。虽然我在代码中省略了第二步,但我在这里使用它来说明这种行为是多么出乎意料。 ($ mysql 以 root 身份登录)。

$ mysql
mysql> CREATE USER 'joe'@'localhost';
Query OK, 0 rows affected (0.01 sec)
mysql> ALTER USER 'joe'@'localhost' IDENTIFIED BY '1234';
Query OK, 0 rows affected (0.02 sec)
mysql> GRANT ALL ON `joe_db`.* TO 'joe'@'localhost';
Query OK, 0 rows affected, 1 warning (0.02 sec)
mysql> exit
Bye

现在为了消除其他问题,我以 joe@localhost 登录并断言我的赠款确实有效。

$ mysql -ujoe -p1234 -hlocalhost
mysql> CREATE DATABASE `joe_db`;
Query OK, 1 row affected (0.01 sec)
mysql> DROP DATABASE `joe_db`;
Query OK, 0 rows affected (0.01 sec)
mysql> exit
Bye

现在让我们再次以 root 身份登录并创建一个新角色 joe_role。我们授予此角色的权限与我们在 joe@localhost 上所做的权限完全相同。然后我们将 joe_role 授予 joe.

$ mysql
mysql> CREATE ROLE 'joe_role';
Query OK, 0 rows affected (0.01 sec)
mysql> GRANT ALL ON `joe_db`.* TO `joe_role`;
Query OK, 0 rows affected (0.01 sec)
mysql> GRANT `joe_role` TO `joe`@'localhost';
Query OK, 0 rows affected (0.01 sec)
mysql> exit
Bye

让我们再次以 joe 身份登录并激活 joe_role。这样做会阻止我们创建数据库。这种行为是我所质疑的。 这是预期的吗?有没有办法在不授予全局权限的情况下为有权创建 joe_db 的用户创建角色?

$ mysql -ujoe -p1234 -hlocalhost
mysql> SET ROLE `joe_role`;
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE DATABASE `joe_db`;
ERROR 1044 (42000): Access denied for user 'joe'@'localhost' to database 'joe_db'

为了消除其他问题,让我们看看将 joe 权限设置为全局时会发生什么。

mysql> exit
Bye
$ mysql
mysql> GRANT ALL ON *.* to `joe_role`;
Query OK, 0 rows affected (0.01 sec)
mysql> exit
Bye
$ mysql -ujoe -p1234 -hlocalhost
mysql> CREATE DATABASE `joe_db`;
Query OK, 1 row affected (0.01 sec)

又能用了。撤销角色也会使其再次起作用。两者显然都不是解决方案。

总结一下: 我做错了什么或者我怎么误解了发生这种情况的角色的概念?

我用this MySQL 8.0.18 image.

与用户具有相同权限的角色在分配给用户时会阻止他们创建数据库。对用户或角色的全局授权 (*.*) 不会发生这种情况,对数据库的 SELECT 特权也不会发生。只有 CREATE 权限会出现此行为。根据 this thread,这是预期的行为。

编辑:已确认这是一个错误并已在 8.0.22 中修复。