MySQL 8.0+ 角色创建与分配必须显式启用
MySQL 默认不开启角色功能,即使版本 ≥ 8.0,
mysql.role_edges表为空或报错
ERROR 3530 (HY000): Role 'xxx' does not exist,大概率是未启用角色支持。必须在启动时或运行时确认
check_proxy_users和
role_support已激活。 检查:执行
SELECT @@global.check_proxy_users, @@global.role_support;,两个值都应为
ON若为
OFF,需在
my.cnf中添加:
[mysqld] check_proxy_users=ON role_support=ON并重启 mysqld 动态启用仅对
check_proxy_users有效(
SET GLOBAL check_proxy_users = ON;),
role_support必须重启生效
用 CREATE ROLE
+ GRANT
分层建模权限,避免直接授给用户
直接对每个用户重复执行
GRANT SELECT ON sales.* TO 'alice'@'%';等操作,会导致权限散落、后期无法批量调整。角色的本质是「权限容器」,应按职责抽象,例如
'analyst_role'、
'report_writer_role'。 创建角色:
CREATE ROLE 'analyst_role';授予权限(对角色,非用户):
GRANT SELECT, SHOW VIEW ON sales.* TO 'analyst_role';将角色赋予用户:
GRANT 'analyst_role' TO 'alice'@'%';用户需显式激活角色才能生效:
SET ROLE 'analyst_role';或设为默认:
SET DEFAULT ROLE 'analyst_role' TO 'alice'@'%';
SHOW GRANTS FOR
查不到角色权限?记得加 USING
执行
SHOW GRANTS FOR 'alice'@'%';只显示直接授予该用户的权限,不会展开其拥有的角色所带的权限——这是常见误解点,导致误判权限是否生效。 查用户+其激活角色的合并权限:
SHOW GRANTS FOR 'alice'@'%' USING 'analyst_role';查某角色本身有哪些权限:
SHOW GRANTS FOR 'analyst_role';查用户被授予了哪些角色:
SELECT * FROM mysql.role_edges WHERE TO_HOST = '%' AND TO_USER = 'alice';
生产环境禁用 WITH ADMIN OPTION
和通配符授权
允许角色转授(
WITH ADMIN OPTION)等于开放权限管理权,极易失控;而
GRANT ALL ON *.*或
GRANT SELECT ON `prod_%`.*这类模糊匹配,在库名动态创建时可能意外覆盖敏感库(如
prod_authvs
prod_auth_backup)。 删除已有越权授权:
REVOKE ADMIN OPTION ON 'admin_role' FROM 'junior_dba'@'%';改用精确库表名:
GRANT SELECT ON sales_q1 TO 'analyst_role';,而非
sales_*定期审计:用
SELECT grantee, table_schema, privilege_type FROM information_schema.role_table_grants;检查角色实际持有的库级权限
角色不是语法糖,是权限治理的最小可控单元。最容易被忽略的是:角色权限变更后,已连接的会话不会自动刷新——用户必须重新执行
SET ROLE或断开重连,否则仍沿用旧权限上下文。
