Mysql 绕过较低的特权

Mysql 绕过较低的特权,mysql,sql,Mysql,Sql,每当我运行此代码时: SET GLOBAL log_bin_trust_function_creators=TRUE; DROP FUNCTION IF EXISTS GreaterCircleNm; DELIMITER go CREATE FUNCTION GreaterCircleNm( lat1 FLOAT, lon1 FLOAT, lat2 FLOAT, lon2 FLOAT ) RETURNS float BEGIN DECLARE pi, q1, dist FLOAT;

每当我运行此代码时:

SET GLOBAL log_bin_trust_function_creators=TRUE; 

DROP FUNCTION IF EXISTS GreaterCircleNm;
DELIMITER go
CREATE FUNCTION GreaterCircleNm( lat1 FLOAT, lon1 FLOAT, lat2 FLOAT, lon2 FLOAT ) RETURNS float
BEGIN
  DECLARE pi, q1, dist FLOAT;
  SET pi = PI();
  SET lat1 = lat1 * pi / 180;
  SET lon1 = lon1 * pi / 180;
  SET lat2 = lat2 * pi / 180;
  SET lon2 = lon2 * pi / 180;
SET q1 = ACOS(sin(lat1)*sin(lat2)+COS(lat1)*COS(lat2)*COS(lon1-lon2));
SET dist = q1*180*60/pi;
RETURN dist;
END;
go
DELIMITER ;

我得到一个错误,告诉我我没有超级特权。我的主机提供商已经告诉我,我不可能(1)获得这些特权或(2)让他们运行代码。这就给我留下了选项(3),即删除
SET GLOBAL log\u bin\u trust\u function\u creators=TRUE同时仍在创建函数。我不确定这是否可行,但我非常感谢您的帮助。

没有超级权限,您不能设置全局
任何内容。
比照

设置全局变量需要超级权限

无法为此变量设置会话

mysql> SET SESSION log_bin_trust_function_creators=0;
ERROR 1229 (HY000): Variable 'log_bin_trust_function_creators' 
is a GLOBAL variable and should be set with SET GLOBAL
这一点得到了的确认,它将变量列为仅全局变量,而不是基于会话的变量

所以不,你不能解决这个问题。如果您的提供商不想给您超级特权,您必须要求他们为您创建函数

或者从另一个提供商那里获得一个不同的托管计划,允许您拥有超级权限


或者不要在SQL存储函数中执行此计算。

@GolezTrol我尝试过什么?运行那个代码?对删除集合全局部分?是的。@GolezTrol你没有任何意义。如果你的意思是做这两件事有用吗,那么你显然没有读整件事,因为我说它没用。如果有,我为什么还要发布它呢?“或者不要在SQL存储函数中执行此计算。”-这可能是第一个;像这样一个简单的计算应该总是在客户端运行,而不是直接在数据库上运行。@KKobayashi,这是一个选项,但我并不是说唯一的选择就是在客户端运行。可以通过SQL查询的select列表或where子句中的完整表达式进行计算。计算结果可用作行限制的条件。