簡體   English   中英

添加函數時出現mysql錯誤

[英]mysql error when adding function

嘗試使用MySQL函數時返回以下錯誤。

#1418 - 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) 

我幾天前開始使用復制..? 不知道這是否可以包含它?! 但我知道一件事 - 它已經奏效:)

如果我嘗試覆蓋(再次添加該功能),則會發生相同的錯誤。

功能

DELIMITER $$

DROP FUNCTION IF EXISTS `stock_in_stock_ids` $$
CREATE DEFINER=`dynaccount`@`localhost` FUNCTION `stock_in_stock_ids`(_running_total_limit INT, _product_id INT, _group_id INT) RETURNS TEXT
BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE _running_count INT default 0;
    DECLARE _id INT;
    DECLARE _count INT;
    DECLARE _ids TEXT DEFAULT NULL;

    DECLARE _cur CURSOR FOR SELECT id, count FROM stock WHERE group_id=_group_id && type=2 && product_id=_product_id ORDER BY time DESC, id DESC;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

    OPEN _cur;

    read_loop: LOOP
        FETCH _cur INTO _id, _count;

        IF done THEN
            SET _ids = '0';
            LEAVE read_loop;
        END IF;

        SET _running_count = _running_count + _count;
        SET _ids = CONCAT_WS(',', _ids, _id);

        IF _running_count >= _running_total_limit THEN
            LEAVE read_loop;
        END IF;
    END LOOP read_loop;

    CLOSE _cur;

    RETURN _ids;
END $$

DELIMITER ;

在這里你有一篇帖子可以保存我過去關於這個錯誤: http//forum.9kgames.com/default.aspx?g = postts&m = 17

在我的情況下,我只需要在create函數中指定DETERMINISTIC

CREATE DEFINER=`dynaccount`@`localhost` FUNCTION `stock_in_stock_ids`(_running_total_limit INT, _product_id INT, _group_id INT) 
RETURNS TEXT
DETERMINISTIC
READS SQL DATA

希望能幫助到你

更新:鏈接不再工作所以這里是archive.org的副本: https ://web.archive.org/web/20120310020353/http://forum.9kgames.com/default.aspx ? g = posts & m =17

這個警告正在上升

一種)。 您想要創建存儲函數和b)。 由於默認的MySQL服務器支持復制,即BINARY LOGGING打開。 要解決此問題,請在此處提供一些提示:

1)。 對於存儲功能本身。 創建存儲函數時,必須聲明它是確定性的或不修改數據。 否則,數據恢復或復制可能不安全。 默認情況下,要接受CREATE FUNCTION語句,必須至少明確指定DETERMINISTICNO SQLREADS SQL DATA 否則會發生錯誤:代碼:

ERROR 1418 (HY000): 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).

此函數是確定性的(並且不會修改數據),因此它是安全的:代碼:

CREATE FUNCTION f1(i INT)
RETURNS INT
DETERMINISTIC
READS SQL DATA
BEGIN
  RETURN i;
END;

此函數使用不確定的UUID(),因此該函數也不是確定性的並且不安全:代碼:

CREATE FUNCTION f2()
RETURNS CHAR(36) CHARACTER SET utf8
BEGIN
  RETURN UUID();
END;

此功能修改數據,因此可能不安全:代碼:

CREATE FUNCTION f3(p_id INT)
RETURNS INT
BEGIN
  UPDATE t SET modtime = NOW() WHERE id = p_id;
  RETURN ROW_COUNT();
END;

MySQL不檢查聲明為DETERMINISTIC的函數是否沒有產生非確定性結果的語句。 盡管可以在不指定DETERMINISTIC情況下創建確定性存儲函數,但是不能像MySQL 5.1.15那樣使用基於語句的二進制日志記錄來執行此函數。 要執行此類功能,必須使用基於行或混合的二進制日志記錄。 或者,如果在函數定義中明確指定DETERMINISTIC,則可以使用任何類型的日志記錄,包括基於語句的日志記錄。

2)雖然您已完成步驟1,但在大多數情況下,您仍可能需要SUPER權限將全局變量log_bin_trust_function_creators設置為true,然后運行以創建存儲函數。 要放松函數創建的前述條件(必須具有SUPER權限並且必須將函數聲明為確定性或不修改數據),請將全局log_bin_trust_function_creators系統變量設置為1.默認情況下,此變量的值為0 ,但你可以改變它:

mysql> SET GLOBAL log_bin_trust_function_creators = 1;

您還可以在啟動服務器時使用log_bin_trust_function_creators選項設置此變量。 如果未啟用二進制日志記錄,則log_bin_trust_function_creators不適用。 創建函數不需要SUPER,除非如前所述,函數定義中的DEFINER值需要它。 注意:如果您的應用程序在多租戶托管服務器上運行且托管公司不想這樣做,您可能需要修改存儲過程而不是使用存儲的函數。

您應該在“RETURNS TEXT”和“BEGIN”之間寫下以下幾行。 它會工作.. :)

LANGUAGE SQL
DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER

默認情況下,要接受CREATE FUNCTION語句,必須at least one of DETERMINISTIC, NO SQL, or READS SQL DATA明確指定at least one of DETERMINISTIC, NO SQL, or READS SQL DATA 否則會發生錯誤:

錯誤1418(HY000):此例程在其聲明中沒有DETERMINISTIC,NO SQL或READS SQL DATA,並且啟用了二進制日志記錄(您可能希望使用安全性較低的log_bin_trust_routine_creators變量)

如果set log_bin_trust_routine_creators to 1 ,則會刪除例程是確定性還是不修改數據的要求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM