Ошибка CREATE FUNCTION «Эта функция не имеет параметров DETERMINISTIC, NO SQL или READS SQL DATA»

В нашей базе данных есть функция для генерации порядкового номера. Она считывает значение из таблицы настроек, увеличивает его, а затем возвращает новое значение. Например:

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, чтобы подавить предупреждение? Я попробовал, и это сработало. Вызовет ли это какие-либо проблемы?

15
задан Federico Razzoli 23 May 2013 в 05:51
поделиться