Nasza baza danych ma funkcję generowania numeru zamówienia. Odczytuje wartość z tabeli Ustawienia, zwiększa ją, a następnie zwraca nową wartość. Na przykład:CREATE FUNCTION error "Ta funkcja nie ma żadnego DETERMINISTYCZNEGO, BEZ SQL lub CZYTAJ DANYCH SQL"
CREATE FUNCTION NextOrderNumber() RETURNS INTEGER UNSIGNED NOT DETERMINISTIC
BEGIN
DECLARE number INTEGER UNSIGNED;
UPDATE Settings SET IntegerValue=LAST_INSERT_ID(IntegerValue+1) WHERE KeyName='NextOrderNumber';
SET number=LAST_INSERT_ID();
return number;
END
Uwaga: Nie krytykuj tej funkcji Wiem, że ma wady, tylko dla zilustrowania.
Używamy tej funkcji w następujący sposób:
INSERT INTO Orders(OrderNumber, ...)
SELECT NextOrderNumber(), ...
Podczas rejestrowania binarnego jest włączona, CREATE FUNCTION daje ten błąd:
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)
Niezależnie od tego, co binlog_format jest ustawiony, to tak naprawdę problem powyższa funkcja? Zgodnie z moim odczytem odpowiedniego MySQL page nie widzę żadnego powodu, dla którego ta funkcja byłaby niezgodna z replikacją, z rejestrowaniem binarnym na poziomie ROW lub STATEMENT.
Jeśli funkcja jest bezpieczna, ustawienie globalnej wartości log_bin_trust_function_creators = 1 wywołuje u mnie niepokój. Nie chcę wyłączać tej kontroli dla wszystkich funkcji, tylko tej. Czy zamiast tego mogę po prostu zgłosić tę funkcję jako NO SQL, aby wyłączyć ostrzeżenie? Wypróbowałem to i zadziałało. Czy to spowoduje jakiś problem?
symcbean - Rozumiem, że to podejście nie działa w klastrze. Nie pytam o ten scenariusz. Pytam o prostą konfigurację master-slave, w której wstawianie/aktualizowanie odbywa się tylko w jednym miejscu. – richb