2016-02-25 66 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參數之間。 –