【问题标题】:Mysql stored procedure error 1418Mysql存储过程报错1418
【发布时间】:2016-02-25 14:15:10
【问题描述】:

我想创建一个可以注册用户的程序,具有一些非常基本的安全性。我做了一个程序,效果很好:

DELIMITER //

CREATE PROCEDURE registriraj (vime varchar(50), vpriimek varchar(50), vemail varchar(100), vgeslo varchar(50), OUT ok varchar(1))

BEGIN

IF NOT EXISTS 
    (SELECT * FROM uporabniki WHERE email = vemail) THEN

    IF (vime != '') AND (vpriimek != '') AND (vemail != '') AND (vgeslo != '') 
    THEN

    INSERT INTO uporabniki (ime,priimek,email,geslo) VALUES (vime,vpriimek,vemail,vgeslo);
    SET ok = 1;
    ELSE SET ok = 0;

    END IF;

END IF;

END; //

我猜我返回了一个值作为输出(ok varchar(1)),但是当我调用它时

CALL vstavi('ime','priimek','iemail','geslo',@out);

SELECT @out;

它在两种情况下都返回 null - true 或 false;

然后我想我会做一个返回的函数,它是:

DELIMITER **
CREATE FUNCTION register (vime varchar(50), vpriimek varchar(50), vemail varchar(100), vgeslo varchar(50))
RETURNS INT
BEGIN
IF NOT EXISTS (SELECT * FROM uporabniki WHERE email = vemail) THEN
    IF (vime != '') AND (vpriimek != '') AND (vemail != '') AND (vgeslo != '') THEN
        INSERT INTO uporabniki (ime,priimek,email,geslo) VALUES (vime,vpriimek,vemail,vgeslo);
        RETURN 1;
    ELSE RETURN 0;
    END IF;
END IF;
END; **

但它给了我这个错误,我无法弄清楚。

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_creators variable)

我进行了研究并发现,解决这个问题的最佳方法是使用 sp,udf-s 更多用于选择数据等等......

也试过这个: 0 46 15:10:14 SET GLOBAL log_bin_trust_function_creators = 1 错误代码:1227。访问被拒绝;您需要(至少一个)此操作的 SUPER 权限 0.031 秒 但它说我需要超级用户权限...

我猜我必须使用 sp。

如何从 sp 的输出参数中获取值?

我正在通过一个 c# windows 应用程序访问它。如何从 sp 的 CALL 中获取?

请帮忙 :) 非常感谢。

【问题讨论】:

    标签: c# mysql stored-procedures udf


    【解决方案1】:

    您在函数中有不允许的插入语句..您不能修改函数内的数据。函数必须是确定性的,这就是错误所说的。

    要放松\抑制此检查,您需要在执行函数之前运行以下脚本

    SET GLOBAL log_bin_trust_function_creators = 1;
    

    【讨论】:

    • @MaticŠincek 检查我的新答案
    • 感谢您的回答,Viru,但这是我发现的。您的回答可能会奏效,但由于我的托管计划,我没有特权 - 我无法创建函数。所以对于每个收到此信息的人。我做了更多的研究。事实证明 Viru 有最好的解决方案,虽然它可能会导致一些安全问题,第二个解决方案是将 READS SQL DATA 放在 begin 和 function 参数之间。
    猜你喜欢
    • 2012-08-02
    • 2011-04-18
    • 2017-02-16
    • 1970-01-01
    • 2016-02-08
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多