MySQL 8.0中为什么通过角色授予的权限使用不了?————角色激活
角色是权限的集合,可以为一组具有相同权限的用户创建一个角色,使用角色来管理数据库权限可以简化授权的过程,从而大大提高了开发效率。
然而在实际实践中,居然有一个大坑!————角色没有被激活
这坑有点深,只可惜坑天生就是可以被填的!
下面来复述一下我的踩坑过程。
先创建一个角色
1 | create role R1; |
进入一个数据库中,为角色授予权限
1 2 | use test;<br># 将对student表的所有操作权限都赋予给角色R1 grant all on student to R1; |
创建一个新用户
1 | # 新用户名字为U1, 登录密码为123456<br> create user U1@ 'localhost' identified by '123456' ; |
将角色R1所拥有的权限授予给用户U1
1 | grant R1 to U1@ 'localhost' ; |
查看此时用户U1所拥有的权限
1 | show grants for U1@ 'localhost' ;<br># 如果还想知道用户通过角色拥有哪些权限,可以在结尾加个using role,即:<br><em>show grants for U1@ 'localhost' using R1;</em> |
会有如下显示:
1 2 | # USAGE表示无权限<br> GRANT USAGE ON *.* TO `U1`@`localhost`<br># 刚刚通过角色R1授予的权限 GRANT `R1`@`%` TO `U1`@`localhost` |
既然如此,不就大功告成了!换用户U1登录验证一下
1 2 | exit<br># 密码为123456 mysql -u U1 -p |
此时用户U1应该可以对test数据库中student表进行操作,那就使用test数据库查看一下
1 | use test; |
出现了如下错误:
1 | ERROR 1044 (42000): Access denied for user 'U1' @ 'localhost' to database 'test' |
什么鬼,反复检查上述过程,肯定是没错的,那是什么问题啊啊啊啊啊啊。。。
原来是角色没有被激活!
原来是角色没有被激活!
原来是角色没有被激活!
查看角色激活情况
1 | SELECT CURRENT_ROLE(); |
激活角色有两种方法:
1、非永久激活:
1 2 | # 第一种方式<br> set default role all to U1@ 'localhost' ; # 第二种方式<br> set default R1 to U1@ 'localhost' ;<br># 注意若此时立即再使用命令 select current_role();还是会显示没有角色被激活。<br># 我们应该先退出,换用户U1登录再查看<br>exit<br>mysql -u U1 -p<br> select current_role();<br># 现在可以看到角色R1已经被激活了<br>show databases;<br>use test;<br>show tables;<br> select * from student; |
2、永久激活:(用户连接到服务器时自动激活所有显式授权和强制角色)
注:默认情况下,禁用自动角色激活。
SET global activate_all_roles_on_login=ON;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类