В нашей базе данных есть функция для создания номера заказа. Он считывает значение из таблицы настроек, увеличивает его, а затем возвращает новое значение. Например:
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 дает эту ошибку:
Эта функция не имеет DETERMINISTIC, NO SQL или READS SQL ДАННЫЕ в декларации и двоичном регистрация включена (возможно, вы захотите использовать менее безопасные log_bin_trust_function_creators переменная)
Независимо от того, какой binlog_format установлен, действительно ли существует проблема с указанной выше функцией? Согласно моему чтению соответствующей страницы MySQL, я не вижу никакой причины, по которой эта функция несовместима с репликацией, с уровнем ROW или STATEMENT двоичный журнал.
Если функция безопасна, установка глобального log_bin_trust_function_creators = 1 делает меня непростым. Я не хочу отключать эту проверку для всех функций, только этого. Могу ли я вместо этого просто добавить функцию NO SQL для подавления предупреждения? Я попробовал, и это сработало. Это вызовет какие-либо проблемы?