创建MySQL功能需要SUPER权限

时间:2014-06-25 14:33:36

标签: php mysql phpmyadmin create-function

我有一个简单的MySQL函数用于比较版本:

CREATE FUNCTION `compareVersions` (
  versionA VARCHAR(50),
  versionB VARCHAR(50)) RETURNS INT DETERMINISTIC NO SQL
BEGIN
  DECLARE a1 INT;
  DECLARE b1 INT;
   DECLARE c1 INT;
    DECLARE d1 INT;
  DECLARE a2 INT;
  DECLARE b2 INT;
   DECLARE c2 INT;
    DECLARE d2 INT;  SET a1 = SUBSTRING_INDEX( `versionA` , '.', 1 );
  SET b1 = SUBSTRING_INDEX(SUBSTRING_INDEX( `versionA` , '.', 2 ),'.',-1);
  SET c1 = SUBSTRING_INDEX(SUBSTRING_INDEX( `versionA` , '.', -2 ),'.',1);
  SET d1 = SUBSTRING_INDEX( `versionA` , '.', -1 );
  SET a2 = SUBSTRING_INDEX( `versionB` , '.', 1 );
  SET b2 = SUBSTRING_INDEX(SUBSTRING_INDEX( `versionB` , '.', 2 ),'.',-1);
  SET c2 = SUBSTRING_INDEX(SUBSTRING_INDEX( `versionB` , '.', -2 ),'.',1);
  SET d2 = SUBSTRING_INDEX( `versionB` , '.', -1 ); 
  IF (a1 > a2) THEN 
    RETURN -1;
  ELSEIF ((a1 = a2) AND (b1 > b2)) THEN
    RETURN -1;
  ELSEIF ((a1 = a2) AND (b1 = b2) AND (c1 > c2)) THEN
    RETURN -1;
  ELSEIF ((a1 = a2) AND (b1 = b2) AND (c1 = c2) AND (d1 > d2)) THEN
    RETURN -1;
  ELSEIF ((a1 = a2) AND (b1 = b2) AND (c1 = c2) AND (d1 = d2)) THEN  
    RETURN 0;
  ELSE
    RETURN 1;
  END IF;
END $$

,其创建失败,

  

您没有SUPER权限并启用了二进制日志记录(您   可能想要使用安全性较低的log_bin_trust_function_creators变量)

这与this question几乎相同,但我的函数不读取任何SQL数据,它很简单,确定性,我认为它没有理由要求任何额外的权限。我不清楚文档是否需要SUPER权限来创建所有功能(这将是荒谬的,使许多用户无法访问存储的功能,无法访问其数据库配置的每个人)。我甚至不知道函数是否有效,这是我想到的第一件事,但语法应该是正确的(分隔符在PHPMyAdmin中设置)。从数据库中获取所有数据并在PHP应用程序中进行比较可以完成,但我认为这样做最简单。可能吗?有没有人有比较版本的更好的解决方案?

2 个答案:

答案 0 :(得分:1)

您可以调整全局变量:

/* allows to create functions as not root */
SET GLOBAL log_bin_trust_function_creators = 1;

我在setup-sql文件中使用它来初始化数据库以恢复转储。

答案 1 :(得分:0)

我通过在PHP中进行冗长且因此丑陋的数据库查询来规避问题。也许使用存储过程而不是函数会更好。搜索后我在文档here中找到了这句话:

  

MySQL 5.5中使用存储函数的当前条件可以   总结如下。 [...]创建或更改存储的函数,   除了CREATE ROUTINE之外,你必须拥有SUPER特权   或通常需要的ALTER ROUTINE权限。

的确,如果启用了二进制日志记录,那么您确实需要SUPER权限才能创建存储函数。这严重限制了大型服务器上存储函数的使用,在我看来,这降低了整个DBMS的价值。看起来像经典的“它不是一个bug,它是一个功能”。我担心如果在将二进制日志记录更改为on后重新启动数据库服务器,那么存储函数会发生什么。