必须先启用角色支持,再分三步操作:创建角色→给角色授权限→把角色授予用户;漏掉任一环,权限就不可用。

必须先启用角色支持,再分三步操作:创建角色→给角色授权限→把角色授予用户;漏掉任一环,权限就不可用。
CREATE ROLE 之前必须 SET GLOBAL activate_all_roles_on_login = ON
MySQL 8.0 默认关闭角色功能,直接执行 CREATE ROLE 'app_reader' 会报错 ERROR 3719 (HY000) 或静默失败。这不是语法问题,而是全局开关没开。
- 由 root 或高权限用户执行:
SET GLOBAL activate_all_roles_on_login = ON; - 同时授予管理权限:
GRANT ROLE_ADMIN ON *.* TO 'admin_user'@'%'; - 写入配置文件持久化(否则重启失效):
activate_all_roles_on_login=ON加到my.cnf的[mysqld]段下 - 执行
FLUSH PRIVILEGES;确保元数据刷新
给角色授权限时不能省略 ON 子句,也不能用列级授权
角色是空容器,CREATE ROLE 后不赋权等于白建。常见错误是写成 GRANT SELECT TO 'app_reader' —— 缺少 ON db.table,MySQL 会报错或授出意外范围的权限。
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
- 正确写法:
GRANT SELECT, INSERT ON myapp.* TO 'app_reader'@'%';(推荐带@'%',避免 host 匹配失败) - 角色不支持列级授权:
GRANT SELECT(id) ON t1 TO 'app_reader'会触发ERROR 1142 - 系统级权限可以授给角色,但不能加
WITH GRANT OPTION(会报错),可用WITH ADMIN OPTION允许该角色再被授给其他用户 - 授完权立即执行
FLUSH PRIVILEGES;,否则新用户无法继承
GRANT 'role' TO 'user' 后必须 SET DEFAULT ROLE 才能生效
执行 GRANT 'app_reader' TO 'dev1'@'%' 只是在 mysql.role_edges 表里加一条绑定记录,用户登录后仍无权限,CURRENT_ROLE() 返回 NULL。
- 必须显式激活:
SET DEFAULT ROLE 'app_reader'@'%' TO 'dev1'@'%';
(host 必须完全匹配) - 若用户已存在多个角色,可设全部默认激活:
SET DEFAULT ROLE ALL TO 'dev1'@'%';,但违背最小权限原则 - 该语句需要
SYSTEM_VARIABLES_ADMIN或APPLICATION_PASSWORD_ADMIN权限,普通用户无法自行执行 - 验证是否真生效,别只看
SHOW GRANTS FOR 'dev1'@'%'—— 它默认不展开角色权限;应改用SHOW GRANTS FOR 'dev1'@'%' USING 'app_reader';或查SELECT CURRENT_ROLE();
最容易被忽略的是 host 匹配和 FLUSH PRIVILEGES 的时机:角色名、用户定义、GRANT、SET DEFAULT ROLE 四处的 host 必须一致;而权限变更后不刷缓存,新连接就看不到更新。这些细节一错,整套角色机制就卡在“看起来配了,实际没用”上。










