我已经创建了一个AWS RDS实例,我已经使用主密码创建了我的主用户,并且它正在工作/正常连接。
但是当我要在该实例上创建一个函数时,它会显示以下错误:
ERROR 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_creator variable).
在我的实例中,变量log_bin_trust_function_creators
显示OFF
,如果我尝试使用SET GLOBAL log_bin_trust_function_creators = 1;
更改变量,则会给我另一个错误"Error Code: 1227. Access denied; you need (at least one of) the SUPER privilege(s) for this operation"
答案 0 :(得分:2)
为RDS实例的参数组设置log_bin_trust_function_creators = 1。
注意:默认参数组不可编辑。创建一个新的参数组并通过从UI(AWS管理控制台)修改它或者使用命令
将其分配给RDS实例DELIMITER $$
CREATE DEFINER=`DB_USERNAME_HERE`@`%` FUNCTION `GetDistance`(coordinate1 VARCHAR(120), coordinate2 VARCHAR(120)) RETURNS decimal(12,8)
READS SQL DATA
BEGIN
DECLARE distance DECIMAL(12,8);
/*Business logic goes here for the function*/
RETURN distance;
END $$
DELIMITER ;
在这里,您必须根据需要将 DB_USERNAME_HERE 替换为您的RDS数据库用户名和函数名。
重要的是:DEFINER=`DB_USERNAME_HERE`@`%`
这是我在参数组中设置log_bin_trust_function_creators = 1后遇到的问题。它就像一个魅力。
答案 1 :(得分:1)
更好的方法是应用您自己的参数组,并将log_bin_trust_function_creators设置为true。 (默认为假)
答案 2 :(得分:0)
当您尝试使用不是当前用户的DEFINER
创建过程/函数/视图时会发生这种情况。
要解决此问题,请删除或更新DEFINER
子句。