【definer和invoker的解释】
创建存储过程的时候可以指定 SQL SECURITY属性,设置为 DEFINER 或者INVOKER,用来奉告mysql在执行存储过程的时候,,是以DEFINER用户的权限来执行,还是以调用者的权限来执行。
默认情况下,使用DEFINER方式,此时调用存储过程的用户必须有存储过程的EXECUTE权限,并且DEFINER指定的用户必须是在mysql.user表中存在的用户。
DEFINER模式下,默认DEFINER=CURRENT_USER,在存储过程执行时,mysql会检查DEFINER定义的用户’user_name’@’host_name’的权限;
INVOKER模式下,在存储过程执行时,会检查存储过程调用者的权限。
【问题出现背景】
一开始使用definer模式创建视图:
CREATE ALGORITHM=UNDEFINED DEFINER=root
@%
SQL SECURITY INVOKER VIEW ‘{viewname}’ +sql
报错【The user specified as a definer (‘root’@’%’) does not exist】
发现是因为权限问题,故执行如下两种操作之一,但是情况一使用权限过大,一般dba不允许执行,这里采用方式二
【解决办法】
一、直接修改函数的definer为应用程序所使用的mysql的用户。(也可能是用户没有权限导致的,这种情况就直接授权就可以了)
grant all privileges on . to root@”%” identified by “.”;
flush privileges;
二、将函数的安全性由difiner修改为invoker
CREATE ALGORITHM=UNDEFINED DEFINER=root
@%
SQL SECURITY INVOKER VIEW ‘{view_name}’ +sql
采用方式二,问题解决
部分内容来自网络,时间有限,仅做整理。