mysql 8.0 角色是解决权限混乱的刚需工具,需显式指定主机名、手动激活、慎用强制角色,并通过多命令组合查清实际权限。
MySQL 8.0 的角色(ROLE)不是“锦上添花”,而是解决权限管理混乱的刚需工具——只要你有 3 个以上需要同类权限的用户,或频繁调整权限,就该用 ROLE,否则迟早会 GRANT 错、REVOKE 漏、审计时抓瞎。
创建和授权角色:别跳过主机名,否则登录就失效
角色名其实是个“伪用户”,格式是 'role_name'@'host',省略 @'host' 默认为 @'%'。但问题来了:如果你创建的是 CREATE ROLE 'dev';(即 @'%'),而用户是 'alice'@'localhost',后续 GRANT 'dev' TO 'alice'@'localhost'; 虽然语法通过,但激活时可能因上下文 host 匹配逻辑出问题(尤其在 strict SQL mode 下)。
- 推荐显式声明 host,保持一致性:比如开发角色统一用
@'%',DBA 角色用@'localhost' - 给角色授予权限,和给用户一样,但对象是角色名:
GRANT SELECT, INSERT ON app_db.* TO 'dev_role'@'%';
- 注意:角色本身不能登录,所以不需要
IDENTIFIED BY,也不支持密码策略
分配角色给用户后,为什么还是没权限?
这是最常踩的坑:角色授给了用户,SHOW GRANTS FOR 'user'@'host'; 也显示成功,但一执行 SELECT 就报 ERROR 1045 (28000): Access denied——根本原因是角色默认不激活。