В нашей базе данных есть функция для генерации порядкового номера. Она считывает значение из таблицы настроек, увеличивает его, а затем возвращает новое значение. Например:
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
Примечание: не критикуйте эту функцию, я знаю, что у нее есть недостатки, это просто для иллюстрации.
Мы используем эту функцию следующим образом:
INSERT INTO Orders(OrderNumber, ...)
SELECT NextOrderNumber(), ...
] Когда двоичное ведение журнала включено,CREATE FUNCTION выдает следующую ошибку:
Эта функция не имеет ни одного из ДЕТЕРМИНИСТИЧЕСКИЙ, НЕТ SQL или ЧИТАЕТ SQL ДАННЫЕ в своем объявлении и двоичном ведение журнала включено (вы можете захотеть использовать менее безопасный log_bin_trust_function_creators переменная)
Независимо от того, какой установлен binlog_format, действительно ли проблема с вышеуказанной функцией? Согласно моему чтению соответствующей страницы MySQL , я не вижу никаких причин, по которым эта функция была бы несовместима с репликацией, с ведением двоичного журнала уровня ROW или STATEMENT.
Если функция безопасна, установка меня беспокоит глобальный log_bin_trust_function_creators = 1. Я не хочу отключать эту проверку для всех функций, только для этой. Могу я вместо этого просто пометить функцию как NO SQL, чтобы подавить предупреждение? Я попробовал, и это сработало. Вызовет ли это какие-либо проблемы?