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数据, 则会出现错误。

解决方法:

有两种

  1. 在创建或更改存储函数时,必须声明它是确定性的,或者它不修改数据。否则,它可能对数据恢复或复制不安全。
CREATE DEFINER=`root`@`localhost` FUNCTION `myfunction`(value INT) RETURNS int(11)
    READS SQL DATA
    DETERMINISTIC
BEGIN
...

如果函数修改了数据,会导致binlog没法保证数据的。所以只有在只读数据库或者数据确定的情况下,才能使用这种方法。

  1. 放宽函数创建的条件(必须具有超级特权,必须声明一个函数是确定性的,或者不修改数据),
    即将全局log_bin_trust_function_creator系统变量设置为1。默认情况下,这个变量的值为0。
 SET GLOBAL log_bin_trust_function_creators = 1;

还可以把这个变量 –log-bin-trust-function-creators=1放到mysql的启动文件 my.cnf中。