当前位置: 移动技术网 > IT编程>数据库>Mysql > MYSQL 创建函数出错的解决方案

MYSQL 创建函数出错的解决方案

2017年12月12日  | 移动技术网IT编程  | 我要评论

金棒棰,足球传说之传奇教练,敌社情

在使用mysql数据库时,有时会遇到mysql函数不能创建的情况。下面就教您一个解决mysql函数不能创建问题的方法,供您借鉴参考。

案例一:

目前在项目中,执行创建mysql的函数出错,

mysql 创建函数出错信息如下:

error code: 1227. access denied; you need (at least one of) the super privilege(s) for this operation

首先检查创建函数的功能是否开启,检查是否开启创建功能的sql如下:

-- 查看是否开启创建函数的功能
show variables like '%func%';
-- 开启创建函数的功能
set global log_bin_trust_function_creators = 1;

执行完sql之后发现已经开启了,随检查自己的sql是否写错(因为sql是别人给的,在别人环境没问题,在自己的环境就有可能)。

突然发现了确实是sql出现问题,由于他创建的sql有指定用户,所以导致出现问题,以下是他的sql:

drop function if exists `nextval`;
delimiter ;;
create definer=`devop`@`%` function `nextval`(`seq_name` varchar(50)) returns varchar(20) charset utf8
begin 
 declare seq_max bigint(20);
 update sequenceconftable set `max` = `max` + next where name = seq_name; 
 select `max` into seq_max from sequenceconftable where name = seq_name ;
 return seq_max; 
end
;;
delimiter ;

由于create_function规范,可以发现就是definer这个参数是可以指定数据库用户的,但是自己的库却不是这个用户,所以导致问题。

目前问题已经解决。

-eof-

案例二:

在mysql创建用户自定义函数时,报以下错误:

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)

这是因为有一个安全参数没有开启,log_bin_trust_function_creators 默认为0,是不允许function的同步的,开启这个参数,就可以创建成功了。

mysql> show variables like '%fun%'; 
+---------------------------------+-------+ 
| variable_name     | value | 
+---------------------------------+-------+ 
| log_bin_trust_function_creators | on | 
+---------------------------------+-------+ 
1 row in set (0.00 sec) 
 
mysql> set global log_bin_trust_function_creators=1;        
query ok, 0 rows affected (0.00 sec) 
 
mysql> show variables like '%fun%';            
+---------------------------------+-------+ 
| variable_name     | value | 
+---------------------------------+-------+ 
| log_bin_trust_function_creators | on | 
+---------------------------------+-------+ 
1 row in set (0.00 sec) 

如果是在有master上开启了该参数,记得在slave端也要开启这个参数(salve需要stop后再重新start),否则在master上创建函数会导致replaction中断。

案例三:

error code : 1418    

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)  
(0 ms taken) 

分析:

根据系统提示,导致该错误的原因可能是一个安全设置方面的配置,查手册log_bin_trust_function_creators参数缺省0,是不允许function的同步的,一般我们在配置repliaction的时候,都忘记关注这个参数,这样在master更新funtion后,slave就会报告错误,然后slave stoped。

处理过程:

登陆mysql数据库

> set global log_bin_trust_function_creators = 1;
> start slave;

跟踪mysql的启动日志,slave正常运行,问题解决。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网