执行自定义函数, 提示用户无权限 !
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