MySQL视图使用,报错【The user specified as a definer ('root'@'%') does not exist】

【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

采用方式二,问题解决

部分内容来自网络,时间有限,仅做整理。

猜你喜欢

转载自blog.csdn.net/lsx991947534/article/details/80647495
今日推荐