执行自定义函数, 提示用户无权限 !
The user specified as a definer (‘tailai_user’@’%’) does not exist
遇到问题:
因某原因把之前的数据库删掉了,项目重启后重新创建的数据库,用户权限也是新的,但是mysql调用上面函数一直报用户无权限
了解一下:definer和invoker
用来奉告mysql在执行函数(或存储过程)的时候,是以DEFINER用户的权限来执行,还是以调用者的权限来执行。
默认情况下,使用DEFINER方式,此时调用函数的用户必须有函数的EXECUTE权限,并且DEFINER指定的用户必须是在mysql.user表中存在的用户。(这个问题是关键,新创建数据库后,tailai_user@%一直不存在导致报错)
INVOKER模式下,在函数调用时,会检查函数调用者的权限。
解决:
给“@%”添加权限,或者重构函数语句将“@%”删除即可
创建自定义函数备注:
DELIMITER $$ 定义结束符。MySQL默认的结束符是分号,但是函数体中可能用到分号。为了避免冲突,需要另外定义结束符。
DELIMITER $$ DROP FUNCTION IF EXISTS genPerson$$ CREATE FUNCTION genPerson(name varchar(20)) RETURNS varchar(50) BEGIN DECLARE str VARCHAR(50) DEFAULT ''; SET @tableName=name; SET str=CONCAT('create table ', @tableName,'(id int, name varchar(20));'); return str; END $$ DELIMITER ;
位置计算函数
CREATE DEFINER=`bobo_demo`@`%` FUNCTION `calcDistance`(`origLng` DECIMAL(20, 6), `origLat` DECIMAL(20, 6), `longitude` DECIMAL(20, 6), `latitude` DECIMAL(20, 6)) RETURNS double BEGIN DECLARE result DOUBLE DEFAULT 0; SET result = round( 6378.138 * 2 * asin( sqrt( pow( sin( ( origLat * pi()/ 180 - latitude * pi()/ 180 )/ 2 ), 2 )+ cos( origLat * pi()/ 180 )* cos( latitude * pi()/ 180 )* pow( sin( ( origLng * pi()/ 180 - longitude * pi()/ 180 )/ 2 ), 2 ) ) )* 1000 ); RETURN result; END;
第一次执行报错:
ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)
解决:
mysql> show variables like 'log_bin_trust_function_creators'; mysql> set global log_bin_trust_function_creators=1;
这样添加了参数以后,如果mysqld重启,那个参数又会消失,因此记得在my.cnf配置文件中添加:
log_bin_trust_function_creators=1
附录:
mysql自定义函数
https://www.cnblogs.com/progor/p/8871480.html
https://blog.csdn.net/weixin_39214481/article/details/82752388