我正在尝试在 MySQL 8 中使用角色,但失败了。我已经阅读了文档,据我所知,我做得对。由于这是一个“hello world”级别的尝试,我认为我遗漏了一些非常明显的东西,但我无法弄清楚。任何帮助将不胜感激。
这就是我想要做的。
CREATE USER 'reader'@'localhost' IDENTIFIED BY 'reader_password';
CREATE ROLE 'read_all';
GRANT SELECT ON MySchema.* TO 'read_all';
GRANT 'read_all' TO 'reader'@'localhost';
上面的脚本是用root用户执行的,所有的语句都成功了。
然后,我使用“读者”用户凭据打开一个新连接,并成功连接。但是,任何从 MySchema 中的任何表中进行 SELECT 的尝试都会被拒绝并显示错误消息:
SELECT * FROM MySchema.SomeTable;
SQL Error [1142] [42000]: SELECT command denied to user 'reader'@'localhost' for table 'SomeTable'
我希望这个 SELECT 能够成功,因为该角色具有 SELECT 权限,并且读者用户已被授予该角色。我错过了什么?
周末愉快!
更新:根据 Rick James 的评论,以下是相关的节目:
在根连接上(使用活动模式上下文“MySchema”):
SHOW CREATE USER 'reader'@'localhost';
--------------------------------------
CREATE USER 'reader'@'localhost' IDENTIFIED WITH 'mysql_native_password' AS '*96B291A4F8FC2B6C453E4C54AD2080751B0D4712' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT PASSWORD REQUIRE CURRENT
SHOW CREATE USER 'read_all';
----------------------------
CREATE USER 'read_all'@'%' IDENTIFIED WITH 'mysql_native_password' REQUIRE NONE PASSWORD EXPIRE ACCOUNT LOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT PASSWORD REQUIRE CURRENT DEFAULT
SHOW GRANTS FOR 'reader'@'localhost';
-------------------------------------
GRANT USAGE ON *.* TO `reader`@`localhost`
GRANT `read_all`@`%` TO `reader`@`localhost`
SHOW GRANTS FOR 'read_all';
----------------------------
GRANT USAGE ON *.* TO `read_all`@`%`
GRANT SELECT ON `MySchema`.* TO `read_all`@`%
在阅读器连接上:
SHOW GRANTS;
------------
GRANT USAGE ON *.* TO `reader`@`localhost`
GRANT `read_all`@`%` TO `reader`@`localhost`
因此,在深入研究文档,特别是“使用角色”页面后,我发现:“默认情况下,将角色授予帐户或在mandatory_roles 系统变量值中命名它不会自动导致角色变为活动状态在帐户会话中...要指定每次用户连接到服务器并进行身份验证时应激活哪些角色,请使用 SET DEFAULT ROLE。 "