MySQL CREATE FUNCTION 在共享网络服务器上失败

Posted

技术标签:

【中文标题】MySQL CREATE FUNCTION 在共享网络服务器上失败【英文标题】:MySQL CREATE FUNCTION fails on a shared webserver 【发布时间】:2010-07-27 19:31:14 【问题描述】:

我有以下功能。当我尝试在网络服务器上创建它时,它失败了

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

我在使用任何其他虚拟主机(以及完全相同的功能)时从来没有遇到过同样的问题,我该如何解决这个问题? (我无法更改 mysql 设置)。

CREATE FUNCTION `has_action_access`(in_role VARCHAR(255), in_request VARCHAR(255), in_action VARCHAR(255)) RETURNS tinyint(1)
    READS SQL DATA
    DETERMINISTIC
BEGIN

    DECLARE current_role VARCHAR(255);  
    DECLARE found, cont TINYINT(1) DEFAULT 0;
    SET current_role = in_role;

    findattempt: REPEAT
        SELECT COUNT(*) FROM cyp_action_access WHERE request = in_request AND action = in_action AND role = current_role INTO found;

        IF found = 0 THEN
            SELECT COUNT(*) FROM cyp_roles WHERE name = current_role INTO cont;
            IF cont = 1 THEN
                SELECT inherits FROM cyp_roles WHERE name = current_role INTO current_role;
                END IF;
            END IF;
    UNTIL (cont = 0 OR found > 0) END REPEAT;
    RETURN found;
END;
MySQL 服务器的版本是5.0.90-log

【问题讨论】:

【参考方案1】:

您的用户没有超级权限。您需要联系您的虚拟主机提供商并让他们更新此信息。如果他们不授予您该选项,请让他们为您执行脚本。

【讨论】:

为什么我需要超级权限才能创建函数? +1:是的,per documentation - 找到 1419 参考并向上滚动一点。 你需要被信任的用户,因为 mysql 对用户函数的处理很糟糕 -> 你可以创建无限循环,这会导致 mysql 服务器的 DoS。 您也可以通过设置 SET GLOBAL log_bin_trust_function_creators = 1 来要求您的提供商“放宽函数创建的上述条件”;

以上是关于MySQL CREATE FUNCTION 在共享网络服务器上失败的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 5.7 create VIEW or FUNCTION or PROCEDURE

MySQL--函数

在 Laravel 4 迁移中创建 MYSQL FUNCTION

MySQL:procedure, function, cursor,handler

MySQL自定义函数

PHP 中的闭包或 create_function