mysql视图权限问题。
偶遇UAT搬家,搬完之后项目组说查询数据有问题,发我一张图如下:

扫了一眼,目测用户没有权限问题:
于是给sread用户赋予了查询权限。
1 2 |
grant select on 数据库.* to 'sread'@'%'; show grants for sread |
然后告诉项目组好了,可以使用了。不想打脸了,继续报错如下:

1 2 3 4 |
这个就很奇怪了,压根这台机器就没有root@%这个用户,于是问项目组mycat是通过哪个用户连接的. 项目组答:xxx 没问题啊,这个root@%打哪来的啊。 百度一下吧。 |
百度上说要给root赋予所有权限,什么什么的,这特么全是瞎扯。而且百度搜索的第一页内容都一样。大家整齐划一的都这么写的。去他娘的百度。
思考20分钟….
盯着项目组发的第一张图片。看这个查询语句也没啥问题。就让项目组发来查询语句,亲自试试。
1 |
SELECT g.ID_ `id` FROM ACT_ID_GROUP g, ACT_ID_MEMBERSHIP membership WHERE g.ID_ = membership.GROUP_ID_ AND membership.USER_ID_ = 'zhaolin' |
sql看着没啥问题,于是我想查下这张表;
1 |
select * from act_id_membership; |

what? 发现不对劲这玩意不是一张表,而是一张视图。
恍然大悟,查看了下这张视图表的详细信息

恍然大悟. 妖怪在这。
原因:由于老项目组机器,他们使用的这个root@%用户创建的视图,而项目搬到新机器新数据库后,新机器数据库压根没有这个用户。所以在执行视图的时候报没有这个用户。
怎么解决?
项目总监说那就加个root@%用户吧。
我xxxxxxx,你见过谁给root开远程权限玩,还不被爆破致残,也是没谁了。
解决办法当然是修改此数据库的定义者了
1 2 |
#这条sql的意思是在mysql数据库中,查出视图定义者为 root@% 的视图,并将其替换为root%localhost 并生成alert执行语句。 select concat("alter DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW ",TABLE_SCHEMA,".",TABLE_NAME," as ",VIEW_DEFINITION,";") from information_schema.VIEWS where DEFINER='root@%'; |
然后将上面语句返回的alter语句执行即可(太长,这里就不写了)
再次查看视图定义者

测试查询

没问题了。
- 本文固定链接: https://www.yoyoask.com/?p=2454
- 转载请注明: shooter 于 SHOOTER 发表