【发布时间】:2014-06-25 14:33:36
【问题描述】:
我有一个用于比较版本的简单 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 应用程序中进行比较,但我认为这样做最容易。是否可以?有没有人有更好的比较版本的解决方案?
【问题讨论】:
-
您运行它的用户是否具有 EXECUTE 权限? (或创建/alter_routine 权限)
-
我不确定,但我想是这样... SHOW GRANTS FOR 'user'@'localhost' 会产生两行:GRANT USAGE 和 GRANT ALL PRIVILEGES
标签: php mysql phpmyadmin create-function