添加函数时出现mysql错误

尝试使用MySQL函数时返回以下错误.

#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) 

我几天前开始使用复制..?不知道这是否可以包含它?!但我知道一件事 – 它已经奏效:)

如果我尝试覆盖(再次添加该功能),则会发生相同的错误.

功能

DELIMITER $$

DROP FUNCTION IF EXISTS `stock_in_stock_ids` $$
CREATE DEFINER=`dynaccount`@`localhost` FUNCTION `stock_in_stock_ids`(_running_total_limit INT, _product_id INT, _group_id INT) RETURNS TEXT
BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE _running_count INT default 0;
    DECLARE _id INT;
    DECLARE _count INT;
    DECLARE _ids TEXT DEFAULT NULL;

    DECLARE _cur CURSOR FOR SELECT id, count FROM stock WHERE group_id=_group_id && type=2 && product_id=_product_id ORDER BY time DESC, id DESC;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

    OPEN _cur;

    read_loop: LOOP
        FETCH _cur INTO _id, _count;

        IF done THEN
            SET _ids = '0';
            LEAVE read_loop;
        END IF;

        SET _running_count = _running_count + _count;
        SET _ids = CONCAT_WS(',', _ids, _id);

        IF _running_count >= _running_total_limit THEN
            LEAVE read_loop;
        END IF;
    END LOOP read_loop;

    CLOSE _cur;

    RETURN _ids;
END $$

DELIMITER ;

解决方法:

在这里你有一个帖子可以保存我过去关于这个错误:
http://forum.9kgames.com/default.aspx?g=posts&m=17

在我的情况下,我只需要在create函数中指定DETERMINISTIC:

CREATE DEFINER=`dynaccount`@`localhost` FUNCTION `stock_in_stock_ids`(_running_total_limit INT, _product_id INT, _group_id INT) 
RETURNS TEXT
DETERMINISTIC
READS SQL DATA

希望能帮助到你

更新:链接不再工作,所以这是archive.org:https://web.archive.org/web/20120310020353/http://forum.9kgames.com/default.aspx?g=posts&m=17的副本

这个警告正在上升

一个).你想创建一个存储的函数和
B).由于默认的MySQL服务器支持复制,即BINARY LOGGING打开.
要解决此问题,请在此处提供一些提示:

1).对于存储功能本身.创建存储函数时,必须声明它是确定性的或不修改数据.否则,数据恢复或复制可能不安全.
默认情况下,要接受CREATE FUNCTION语句,必须至少明确指定DETERMINISTIC,NO SQL或READS SQL DATA中的一个.否则会发生错误:
码:

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).

此功能是确定性的(并且不会修改数据),因此它是安全的:
码:

CREATE FUNCTION f1(i INT)
RETURNS INT
DETERMINISTIC
READS SQL DATA
BEGIN
  RETURN i;
END;

此函数使用不确定的UUID(),因此该函数也不是确定性的并且不安全:
码:

CREATE FUNCTION f2()
RETURNS CHAR(36) CHARACTER SET utf8
BEGIN
  RETURN UUID();
END;

此功能修改数据,因此可能不安全:
码:

CREATE FUNCTION f3(p_id INT)
RETURNS INT
BEGIN
  UPDATE t SET modtime = NOW() WHERE id = p_id;
  RETURN ROW_COUNT();
END;

MySQL不检查声明为DETERMINISTIC的函数是否没有产生非确定性结果的语句.
尽管可以在不指定DETERMINISTIC的情况下创建确定性存储函数,但是不能像MySQL 5.1.15那样使用基于语句的二进制日志记录来执行此函数.要执行此类功能,必须使用基于行或混合的二进制日志记录.或者,如果在函数定义中明确指定DETERMINISTIC,则可以使用任何类型的日志记录,包括基于语句的日志记录.

2)虽然您已完成步骤1,但在大多数情况下,您仍可能需要SUPER权限将全局变量log_bin_trust_function_creators设置为true,然后运行以创建存储函数.
要放松函数创建的前述条件(必须具有SUPER权限并且必须将函数声明为确定性或不修改数据),请将全局log_bin_trust_function_creators系统变量设置为1.默认情况下,此变量的值为0 ,但你可以改变它:

mysql> SET GLOBAL log_bin_trust_function_creators = 1;

您还可以在启动服务器时使用log_bin_trust_function_creators选项设置此变量.
如果未启用二进制日志记录,则log_bin_trust_function_creators不适用.创建函数不需要SUPER,除非如前所述,函数定义中的DEFINER值需要它.
注意:如果您的应用程序在多租户托管服务器上运行且托管公司不想这样做,您可能需要修改存储过程而不是使用存储的函数.

上一篇:使用MYSQL复制来加速架构更改和表格优化


下一篇:设置MySQL主 – 主复制