首页 > 解决方案 > 有人可以帮助我使用 MySQL 中的功能吗?

问题描述

我运行以下脚本:

USE MODERN_FAMILY;
DROP FUNCTION IF EXISTS compare_news; 
DELIMITER $$
CREATE FUNCTION compare_news(n INT, m INT)
RETURNS VARCHAR(20)

BEGIN
DECLARE s VARCHAR(20);

IF n>m THEN SET s='>'; 
ELSEIF n=m THEN SET s='='; 
ELSE SET s='<';
END IF;
SET s = CONCAT(n, ' ', s, ' ',m);
RETURN s; END;$$

第一个脚本返回此错误:

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

然后,我运行这个:

USE MODERN_FAMILY;
SELECT compare_news(2,5);

它返回此错误:

Error Code: 2014. Commands out of sync; you can't run this command now.

有人知道我的脚本是否有错误吗?还是和我的 SQL 配置有关?

标签: mysqlfunctionmysql-workbench

解决方案


log_bin_trust_function_creators变量控制二进制日志是否应该信任存储函数的创建者不创建不安全的存储函数。

参考:存储程序记录

创建存储函数时,必须声明它是确定性的或不修改数据。否则,数据恢复或复制可能不安全。

默认情况下,要接受 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)

要放宽函数创建的上述条件(您必须具有 SUPER 特权,并且必须将函数声明为确定性或不修改数据),请将全局 log_bin_trust_function_creators 系统变量设置为 1。

解决方案 1:使您的函数本质上不操纵数据或确定性

CREATE FUNCTION `compare_news`(
    `n` INT,
    `m` INT
) RETURNS VARCHAR(20) CHARSET latin1 LANGUAGE SQL DETERMINISTIC NO SQL SQL SECURITY DEFINER COMMENT '' 
BEGIN 
    DECLARE s VARCHAR(20); 
    IF n>m THEN 
        SET s='>'; 
    ELSEIF n=m THEN 
        SET s='='; 
    ELSE 
        SET s='<'; 
    END IF; 

    SET s = CONCAT(n, ' ', s, ' ',m); 
    RETURN s; 
END

解决方案 2log_bin_trust_function_creators :通过将 mysql变量设置为 ,使 MySQL 能够信任此类函数ON

参考:log_bin_trust_function_creators

SET GLOBAL log_bin_trust_function_creators = 1;

如果您不更新配置以反映更改,则该变量将在重新启动时更改。


推荐阅读