2016-02-25 67 views
0

我想创建一个过程,可以注册用户一些非常非常基本的安全性。我做了一个程序,它工作得很好:Mysql存储过程错误1418

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权限(s)进行此操作0.031秒 但它说我需要超级用户权限...

我的猜测是我必须使用sp。

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

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

请帮助:)很多apreciated。

回答

0

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

要放松\抑制这种检查,你需要在执行你的函数

SET GLOBAL log_bin_trust_function_creators = 1; 
+0

没有,之前运行下面的脚本,没有工作:(任何其他的想法? –

+0

@MaticŠincek检查我的新的答案 – Viru

+0

谢谢您答案,Viru,但这里是我发现的,你的答案可能会起作用,但由于我的托管计划,我没有特权 - 我无法创建函数,因此对于每个人都有这个消息。研究更多,证明Viru具有最好的解决方案,它可能会导致一些安全问题,第二种解决方案是将READS SQL DATA放在begin和function参数之间。 –