Mysql 错误 This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration
时间:2019-04-16 23:59:04 来源:igfitidea点击:
当使用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)
MySQL的解释是:
创建存储函数时,必须声明它是确定性的,或者它不修改数据。否则,它可能对数据恢复或复制不安全。
原因:
如果在MySQL服务器上打开了复制所需的二进制日志记录选项,同时 默认情况下,对于 CREATE FUNCTION语句,没有显式地指定至少一个确定性、无SQL或读SQL数据, 则会出现错误。
解决方法:
有两种
- 在创建或更改存储函数时,必须声明它是确定性的,或者它不修改数据。否则,它可能对数据恢复或复制不安全。
CREATE DEFINER=`root`@`localhost` FUNCTION `myfunction`(value INT) RETURNS int(11) READS SQL DATA DETERMINISTIC BEGIN ...
如果函数修改了数据,会导致binlog没法保证数据的。所以只有在只读数据库或者数据确定的情况下,才能使用这种方法。
- 放宽函数创建的条件(必须具有超级特权,必须声明一个函数是确定性的,或者不修改数据),
即将全局log_bin_trust_function_creator系统变量设置为1。默认情况下,这个变量的值为0。
SET GLOBAL log_bin_trust_function_creators = 1;
还可以把这个变量 –log-bin-trust-function-creators=1放到mysql的启动文件 my.cnf中。