1.事件背景 今天临近中午饭点时,开发同事发来需求,在mariadb库创建两个视图,要求指定帐号有只读权限。 很简单的需求,连上服务器,两条grant命令一刷,fulsh privileges 回车,楼主就安心吃饭去了。
2.重点来了,待楼主用餐归来,(还在楼下打了盘王者农药,排位两连跪(┬_┬)), 上午发来需求的同事找我了。
3.柳暗花明 瞬间蒙圈的我,回了个稍等,就赶紧去查原因了。 在反复确认grant没问题后,楼主持续蒙圈了。此时距离接到这个问题,已经过去了20分钟, 甚是焦急啊,明明一个小需求怎么会这样呢。 就在楼主万分无奈时,突然点到设计视图的高级页面,看到了安全性‘Definer’这个点。
万能的某度给了我答案,当视图的安全性为DEFINER时,数据库中存在DEFINER指定的用户,也就是图中的定义者所填写的。并且该用户拥有对应的权限,才能执行。与当前用户是否有权限无关。 当视图的安全性为INVOKER时,只要执行者有执行权限,就可以成功执行。 上图时我修改后问题解决的图了,因为当时写的是‘root@192.168.%.%’且视图的安全性为DEFINER引起的。当然,如果开发不是指定帐号只读的话,也可以将安全性定义INVOKER,这样只要有对这个视图有权限的都可以查看了。
参考资料: http://pdf.us/2018/02/24/679.html