mysql - 有人可以帮助我使用 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 配置有关?
解决方案
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;
如果您不更新配置以反映更改,则该变量将在重新启动时更改。
推荐阅读
- excel - 相加后单元格值变为照片
- angular - 从 Angular 6+ 客户端应用程序调用 GET ASP .NET core 2.1 Web API 不会返回任何数据
- c - while循环终止后的代码不运行
- python - Django 中 /admin/todo/todo/ 的 OperationalError
- javascript - 通过 qwest 的 REST Firebase 请求
- javascript - 如何在弹出窗口中使用 CodeIgniter 中的 Ajax/Javascript 插入数据和照片/图像?
- java - java中的注册表单
- java - 在 Jtable 中编辑单元格时获取特定列的总和
- python - 在 Jupyter Notebook 中更改数据框的单元格宽度
- ios - Appstore 根据屏幕需要时间