Mysql自定义函数遇到的问题

执行自定义函数, 提示用户无权限 !

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