Można to naprawić na dwa sposoby:
-
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;
Ustawienie rozluźnia sprawdzanie funkcji niedeterministycznych. Funkcje niedeterministyczne to funkcje, które modyfikują dane (tj. mają instrukcje aktualizacji, wstawiania lub usuwania). Aby uzyskać więcej informacji, zobacz tutaj .
Należy pamiętać, że jeśli logowanie binarne NIE jest włączone, to ustawienie nie ma zastosowania.
Rejestrowanie binarne zapisanych programów
log_bin_trust_function_creators
Najlepszym podejściem jest lepsze zrozumienie i wykorzystanie deklaracji deterministycznych dla funkcji składowanych. Te deklaracje są używane przez MySQL do optymalizacji replikacji i dobrze jest je starannie wybrać, aby zapewnić zdrową replikację.
DETERMINISTYCZNE Procedura jest uważana za „deterministyczną”, jeśli zawsze daje ten sam wynik dla tych samych parametrów wejściowych i NIE jest deterministyczna w przeciwnym razie. Jest to najczęściej używane z przetwarzaniem łańcuchów lub matematyki, ale nie ogranicza się do tego.
NIE OKREŚLONE W przeciwieństwie do „DETERMINISTIC”.”Jeśli w definicji procedury nie podano ani DETERMINISTIC ani NOT DETERMINISTIC, domyślną wartością jest NOT DETERMINISTIC. Aby zadeklarować, że funkcja jest deterministyczna, musisz jawnie określić DETERMINISTIC. ".Wygląda więc na to, że jeśli nie zostanie zrobione żadne oświadczenie, MySQL potraktuje funkcję jako "NIE DETERMINYSTYCZNĄ". To stwierdzenie z instrukcji jest sprzeczne z innym stwierdzeniem z innego obszaru instrukcji, które mówi, że:" Gdy tworzysz funkcji przechowywanej należy zadeklarować, że jest deterministyczna lub nie modyfikuje danych. W przeciwnym razie odzyskiwanie lub replikacja danych może być niebezpieczne. Domyślnie, aby instrukcja CREATE FUNCTION została zaakceptowana, co najmniej jedna z opcji DETERMINISTIC, NO SQL lub READS SQL DATA musi być wyraźnie określona. W przeciwnym razie wystąpi błąd "
Osobiście dostał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ć.
ODCZYTA DANE SQL To wyraźnie informuje MySQL, że funkcja będzie odczytywać TYLKO dane z baz danych, dlatego nie zawiera instrukcji modyfikujących dane, ale zawiera instrukcje SQL odczytujące dane (np. SELECT).
MODYFIKUJE DANE SQL Oznacza to, że procedura zawiera instrukcje, które mogą zapisywać dane (na przykład zawiera instrukcje UPDATE, INSERT, DELETE lub ALTER).
BEZ SQL Oznacza to, że procedura nie zawiera instrukcji SQL.
ZAWIERA SQL Oznacza to, że procedura zawiera instrukcje SQL, ale nie zawiera instrukcji odczytujących lub zapisujących dane. Jest to wartość domyślna, jeśli żadna z tych cech nie jest podana wprost. Przykładami takich oświadczeń są SELECT NOW(), SELECT [email protected] , SET @x =1 lub DO RELEASE_LOCK('abc'), które wykonują, ale nie odczytują ani nie zapisują danych.
Zwróć uwagę, że istnieją funkcje MySQL, które nie są deterministyczne, takie jak:NOW(), UUID() itp., które prawdopodobnie dadzą różne wyniki na różnych maszynach, więc funkcja użytkownika zawierająca takie instrukcje musi być zadeklarowana jako NIEDETERMINYSTYCZNA .Ponadto funkcja, która odczytuje dane z niezreplikowanego schematu, jest wyraźnie NIEZDETERMINOWANA.*