Mysql视图权限设置的踩坑经历
1、问题
今天导入数据库的时候,在访问视图的时候总是报错,说没有用户和权限。
后来发现视图的定义者是原来的'medical'@'%',并且安全性设置的是definer,现在这个用户不存在了,虽然新用户'user'@'192.168.1.%’拥有和原来相同的数据库权限,但是依然不能使用这些视图。
2、解决
- 把安全性定义由definer设置为invoker就好了.
- 线上生产环境建议不要改安全定义,毕竟涉及安全。、
- 建议把'medical'@'%'改成'xxx'@'%',就是把定义者改成当前在用的有权限的用户
3、definer和invoker的区别
在创建视图或者是存储过程的时候,是需要定义安全验证方式的(也就是安全性SQL SECURITY),其值可以为definer或invoker,表示在执行过程中,使用谁的权限来执行。
definer:由definer(定义者)指定的用户的权限来执行
invoker:由调用这个视图(存储过程)的用户的权限来执行
- definer
当定义为DEFINER时,必须数据库中存在DEFINER指定的用户,并且该用户拥有对应的操作权限,才能成功执行。与当前用户是否有权限无关。
- invoker
当定义为INVOKER时,只要执行者有执行权限,就可以成功执行。