错误码: 1418 This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and

创建存储函数的时候,会遇到这样的错误:

SQL:

DELIMITER ;;
CREATE FUNCTION `GetGuid`() RETURNS VARCHAR(40) CHARSET utf8 COMMENT '获取不带"-"的GUID'
BEGIN
DECLARE id VARCHAR(40);
SET id=(SELECT REPLACE(UUID(),'-',''));
RETURN id;
END;;
DELIMITER ;

错误码: 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)


原因:

如果开启了二进制日志(考虑需要复制,备份等),mysql从安全角度考虑(比如存储函数里存在一些不特定的函数,会导致主从的数据可能不一致),存储过程和函数需要遵守一些限制。参数如下:

log_bin_trust_function_creators 

1.默认OFF,在这样的情况下,创建者首先必须有SUPER权限,才能创建存储函数。 并且,创建的存储函数必须是确定的,不可以修改数据,在创建函数的时候必须指   定DETERMINISTIC, NO SQL, or READS SQL DATA ,这就是上面报错的原因。

(a).DETERMINISTIC 不确定
(b).NO SQL 没有SQL,自然也不会修改数据
(c).READS SQL DATA 只是读取数据
(d).MODIFIES SQL DATA  修改数据(需要开启log_bin_trust_function_creators ,当然开启后可以省略不写)

DELIMITER ;;
CREATE FUNCTION test1() RETURNS VARCHAR(40) CHARSET utf8 COMMENT '获取不带"-"的GUID'   READS SQL DATA  
BEGIN
DECLARE id VARCHAR(40);
SET id=(SELECT '123456');
RETURN id;
END;;
DELIMITER ;


2.如果开启(设置为ON或者1),则不会有任何限制,当然也会有风险,就是创建者不会创建不安全不确定的存储函数。

触发器同理。

    


你可能感兴趣的:(mysql)