Є два способи виправити це:
Виконайте наступне на консолі MySQL:
SET GLOBAL log_bin_trust_function_creators = 1;
Додайте до файлу конфігурації mysql.ini наступне:
log_bin_trust_function_creators = 1;
Налаштування полегшує перевірку недетермінованих функцій. Недетерміновані функції - це функції, які змінюють дані (тобто мають операцію оновлення, вставлення або видалення). Для отримання додаткової інформації дивіться тут .
Зверніть увагу, якщо двійковий журнал НЕ включений, це налаштування не застосовується.
Двійковий журнал збережених програм
Якщо бінарний журнал не ввімкнено, log_bin_trust_function_creators не застосовується.
log_bin_trust_function_creators
Ця змінна застосовується, коли ввімкнено двійковий журнал.
Найкращий підхід - це краще розуміння та використання детермінованих декларацій для збережених функцій. Ці декларації використовуються MySQL для оптимізації реплікації, і добре їх вибирати ретельно, щоб мати здорову реплікацію.
ДЕТЕРМІНІСТИЧНА
Рутина вважається детермінованою, якщо вона завжди дає однаковий результат для одних і тих же вхідних параметрів, а НЕ ДЕТЕРМІНІСТИЧНА в іншому випадку. Це здебільшого використовується при обробці рядків або математики, але не обмежуючись цим.
НЕ ДЕТЕРМІНІСТИЧНИЙ
Напроти "ДЕТЕРМІНІСТИЧНОГО". " Якщо ні визначені, ні DETERMINISTIC, ні NOT DETERMINISTIC в рутинному визначенні не задано, за замовчуванням НЕ ДЕТЕРМІНІСТИЧНІ . Отже, схоже, що якщо не буде зроблено жодного твердження, MySQl розцінить цю функцію як "НЕ ДЕТЕРМІНІСТИЧНУ". Це твердження з посібника суперечить іншому твердженню з іншої області посібника, в якому сказано, що: "Створюючи збережену функцію, ви повинні заявити, що вона детермінована, або що вона не змінює дані. В іншому випадку це може бути небезпечно для відновлення чи реплікації даних. За замовчуванням для прийняття оператора CREATE FUNCTION принаймні один з DETERMINISTIC, NO SQL або READS SQL DATA повинен бути чітко вказаний. Інакше виникає помилка "
Я особисто отримав помилку в MySQL 5.5, якщо декларації немає, тому я завжди ставив принаймні одну декларацію "DETERMINISTIC", "NOT DETERMINISTIC", "NO SQL" або "READS SQL DATA" незалежно від інших декларацій, які у мене можуть бути.
ЧИТАТИ SQL DATA
Це явно повідомляє MySQL, що функція буде ЛИШЕ читати дані з баз даних, таким чином, вона не містить інструкцій, що змінюють дані, але містить інструкції SQL, які читають дані (eq SELECT).
МОДИФІКАЦІЙНІ ДАНІ SQL
Це вказує на те, що підпрограма містить оператори, які можуть записувати дані (наприклад, вона містить інструкції 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 може зменшити продуктивність, викликаючи недоступні оптимізації.