2012-07-03 2 views
3

Следующая ошибка возвращается при попытке использовать функцию MySQL ..ошибка 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 ; 

ответ

7

здесь есть почта что спасает меня в прошлом об этой ошибке: http://forum.9kgames.com/default.aspx?g=posts&m=17

в моем случае я только должен был указать 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 

надеюсь, что это помогает

UPDATE: ссылка не работает больше так вот копия 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, которое должно быть принято, должно быть указано явно не менее одного из DETERMINISTIC, NO SQL или READS 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 как истину, а затем запустить для создания хранимой функции. Чтобы смягчить предыдущие условия на создание функции (у вас должна быть привилегия 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 в определении функции не требует этого. Примечание. Если ваши приложения запускаются на сервере с несколькими арендаторами, а хостинговая компания не хочет этого делать, вам может потребоваться изменить хранимые процедуры вместо использования хранимых функций.

+1

Ваша ссылка больше не доступна, делает ваш ответ непригодным к использованию. –

+0

@FlipVernooij ссылка не работает, но ответ есть –

+0

true, и она отвечает на проблему OP, но для кого-то, у кого есть такая же, но немного другая проблема (например, я), ответ ничего не объясняет по поводу проблемы и так бесполезно для всех остальных, кроме OP. –

4

Вы должны написать следующие строки между «RETURNS TEXT» и «BEGIN». Она будет работать .. :)

LANGUAGE SQL 
DETERMINISTIC 
CONTAINS SQL 
SQL SECURITY DEFINER 
0

По умолчанию для CREATE FUNCTION заявление будет принято, at least one of DETERMINISTIC, NO SQL, or READS SQL DATA должны быть указаны в явном виде. В противном случае возникает ошибка:

ERROR 1418 (HY000): Эта процедура не имеет ни один из детерминированных, NO SQL, или ЧИТАЕТ SQL DATA в своей декларации и двоичная регистрация включена (вы могли хотите использовать менее безопасным log_bin_trust_routine_creators переменная)

Если вы set log_bin_trust_routine_creators to 1, требование, чтобы подпрограммы были детерминированными или не изменяли данные, отбрасывается.

Смежные вопросы