Ответ 1
Есть два способа исправить это:
-
Выполните следующее в консоли MySQL:
SET GLOBAL log_bin_trust_function_creators = 1;
-
Добавьте следующее в файл конфигурации mysql.ini:
log_bin_trust_function_creators = 1;
Настройка ослабляет проверку недетерминированных функций. Недетерминированные функции - это функции, которые изменяют данные (т.е. имеют операторы update, insert или delete). Для получения дополнительной информации см. Здесь.
Обратите внимание, что если двоичное ведение журнала НЕ включено, этот параметр не применяется.
Двоичная регистрация хранимых программ
Если двоичное ведение журнала не включено, log_bin_trust_function_creators не применяется.
log_bin_trust_function_creators
Эта переменная применяется, когда включено двоичное ведение журнала.
Лучший подход - это лучшее понимание и использование детерминированных объявлений для хранимых функций. Эти объявления используются MySQL для оптимизации репликации, и было бы неплохо тщательно их выбрать, чтобы репликация работала.
ДЕТЕРМИНИСТИЧЕСКАЯ Процедура считается "детерминированной", если она всегда дает один и тот же результат для одних и тех же входных параметров, а НЕ ДЕТЕРМИНИСТИЧЕСКАЯ в противном случае. Это в основном используется со строкой или математической обработкой, но не ограничивается этим.
НЕ ДЕТЕРМИНИСТИЧЕСКИЙ Противоположность "ДЕТЕРМИНИСТИЧЕСКОМУ". "Если ни DETERMINISTIC, ни NOT DETERMINISTIC не указаны в определении подпрограммы, по умолчанию используется значение NOT DETERMINISTIC. Чтобы объявить, что функция является детерминированной, необходимо явно указать DETERMINISTIC.". Таким образом, кажется, что если не будет сделано никаких заявлений, MySQl будет рассматривать функцию как "НЕ ДЕТЕРМИНИСТИЧЕСКАЯ". Это утверждение из руководства находится в противоречии с другим утверждением из другой области руководства, в котором говорится: "Когда вы создаете хранимую функцию, вы должны объявить, что она является детерминированной или не изменяет данные. В противном случае это может быть небезопасно для восстановление или репликация данных. По умолчанию для принятия оператора CREATE FUNCTION должен быть явно указан хотя бы один из DETERMINISTIC, NO SQL или READS SQL DATA. В противном случае возникает ошибка "
Я лично получил ошибку в MySQL 5.5, если нет объявления, поэтому я всегда помещаю по крайней мере одно объявление "DETERMINISTIC", "NOT DETERMINISTIC", "NO SQL" или "READS SQL DATA" независимо от других объявлений, которые у меня могут быть.
READS SQL DATA Это явно говорит MySQL, что функция будет ТОЛЬКО читать данные из баз данных, таким образом, она не содержит инструкции, которые изменяют данные, но она содержит инструкции SQL, которые читают данные (например, SELECT).
MODIFIES SQL DATA Это указывает, что подпрограмма содержит операторы, которые могут записывать данные (например, она содержит инструкции UPDATE, INSERT, DELETE или ALTER).
NO SQL Это означает, что подпрограмма не содержит операторов SQL.
СОДЕРЖИТ SQL Это указывает на то, что подпрограмма содержит инструкции SQL, но не содержит операторов, которые читают или записывают данные. Это значение по умолчанию, если ни одна из этих характеристик не указана явно. Примерами таких операторов являются SELECT NOW(), SELECT 10+ @b, SET @x = 1 или DO RELEASE_LOCK ('abc'), которые выполняют, но не читают и не записывают данные.
Обратите внимание, что есть функции MySQL, которые не являются детерминированными, например NOW(), UUID() и т.д., Которые могут давать разные результаты на разных компьютерах, поэтому пользовательская функция, содержащая такие инструкции, должна быть объявлена как NOT DETERMINISTIC., Кроме того, функция, которая считывает данные из нереплицированной схемы, явно недетерминирована. *
Оценка природы подпрограммы основана на "честности" создателя: MySQL не проверяет, что подпрограмма, объявленная как DETERMINISTIC, не содержит операторов, которые дают недетерминированные результаты. Однако неправильное указание процедуры может повлиять на результаты или производительность. Объявление недетерминированной подпрограммы как DETERMINISTIC может привести к неожиданным результатам, заставляя оптимизатор сделать неправильный выбор плана выполнения. Объявление детерминированной подпрограммы как NONDETERMINISTIC может привести к снижению производительности из-за невозможности использования доступных оптимизаций.