Istnieją dwa sposoby, aby to naprawić:
Wykonaj następujące czynności w konsoli MySQL:
SET GLOBAL log_bin_trust_function_creators = 1;
Dodaj następujące elementy do pliku konfiguracyjnego mysql.ini:
log_bin_trust_function_creators = 1;
To ustawienie rozluźnia sprawdzanie funkcji niedeterministycznych. Funkcje niedeterministyczne to funkcje, które modyfikują dane (tj. Mają instrukcje aktualizacji, wstawiania lub usuwania). Więcej informacji można znaleźć tutaj .
Należy pamiętać, że jeśli rejestrowanie binarne NIE jest włączone, to ustawienie nie ma zastosowania.
Rejestrowanie binarne programów przechowywanych
Jeśli rejestrowanie binarne nie jest włączone, log_bin_trust_function_creators nie ma zastosowania.
log_bin_trust_function_creators
Ta zmienna ma zastosowanie, gdy jest włączone rejestrowanie binarne.
Najlepszym podejściem jest lepsze zrozumienie i użycie deterministycznych deklaracji dla funkcji przechowywanych. Te deklaracje są używane przez MySQL do optymalizacji replikacji i dobrze jest je wybrać ostrożnie, aby zapewnić prawidłową replikację.
DETERMINISTYCZNA
Procedura jest uważana za „deterministyczną”, jeśli zawsze daje ten sam wynik dla tych samych parametrów wejściowych, a NIE DETERMINISTYCZNA w innym przypadku. Jest to głównie używane do przetwarzania ciągów lub matematyki, ale nie ogranicza się do tego.
NOT DETERMINISTIC
Przeciwieństwo „DETERMINISTIC”. „ Jeśli w definicji procedury nie podano ani DETERMINISTIC, ani NOT DETERMINISTIC, wartością domyślną jest NOT DETERMINISTIC. Aby zadeklarować, że funkcja jest deterministyczna, należy wyraźnie określić DETERMINISTIC. ”. Wydaje się więc, że jeśli nie zostanie podane żadne polecenie, MySQl potraktuje funkcję jako „NIEDETERMINISTYCZNĄ”. To stwierdzenie z instrukcji jest sprzeczne z innym stwierdzeniem z innego obszaru instrukcji, które mówi, że: „Podczas tworzenia funkcji przechowywanej należy zadeklarować, że jest deterministyczna lub że nie modyfikuje danych. W przeciwnym razie odzyskanie lub replikacja danych może być niebezpieczne. Domyślnie, aby instrukcja CREATE FUNCTION została zaakceptowana, należy jawnie określić co najmniej jedną z opcji: DETERMINISTIC, NO SQL lub READS SQL DATA. W przeciwnym razie wystąpi błąd ”
Osobiście otrzymałem błąd w MySQL 5.5, jeśli nie ma deklaracji, więc zawsze umieszczam co najmniej jedną deklarację „DETERMINISTIC”, „NOT DETERMINISTIC”, „NO SQL” lub „READS SQL DATA”, niezależnie od innych deklaracji, które mogę mieć.
CZYTA DANE SQL
To wyraźnie mówi MySQL, że funkcja będzie odczytywać TYLKO dane z baz danych, a zatem nie zawiera instrukcji modyfikujących dane, ale zawiera instrukcje SQL, które odczytują dane (np. SELECT).
MODIFIES SQL DATA
Oznacza to, że procedura zawiera instrukcje, które mogą zapisywać dane (na przykład zawiera instrukcje UPDATE, INSERT, DELETE lub ALTER).
NO SQL
Oznacza to, że procedura nie zawiera instrukcji SQL.
CONTAINS SQL
Wskazuje, że procedura zawiera instrukcje SQL, ale nie zawiera instrukcji odczytujących lub zapisujących dane. Jest to ustawienie domyślne, jeśli żadna z tych cech nie jest podana jawnie. Przykładami takich instrukcji są SELECT NOW (), SELECT 10 + @ b, SET @x = 1 lub DO RELEASE_LOCK ('abc'), które wykonują się, ale nie odczytują ani nie zapisują danych.
Zauważ, że istnieją funkcje MySQL, które nie są deterministycznie bezpieczne, takie jak: NOW (), UUID () itp., Które mogą powodować różne wyniki na różnych maszynach, więc funkcja użytkownika, która zawiera takie instrukcje, musi być zadeklarowana jako NIEDETERMINISTYCZNA . Ponadto funkcja, która odczytuje dane z niereplikowanego schematu, jest wyraźnie NONDETERMINISTYCZNA. *
Ocena natury procedury opiera się na „uczciwości” twórcy: MySQL nie sprawdza, czy procedura zadeklarowana jako DETERMINISTIC jest wolna od stwierdzeń, które dają wyniki niedeterministyczne. Jednak błędne zadeklarowanie rutyny może wpłynąć na wyniki lub wpłynąć na wydajność. Zadeklarowanie niedeterministycznej procedury jako DETERMINISTIC może prowadzić do nieoczekiwanych rezultatów, powodując, że optymalizator dokona nieprawidłowych wyborów planu wykonania. Zadeklarowanie deterministycznej procedury jako NONDETERMINISTIC może obniżyć wydajność, powodując, że dostępne optymalizacje nie będą używane.