Подтвердить что ты не робот

DETERMINISTIC, NO SQL или READS SQL DATA в декларации и двоичном протоколе

При импорте базы данных в mysql у меня есть следующая ошибка:

1418 (HY000) at line 10185: 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)

Я не знаю, какие вещи мне нужно изменить. Может ли кто-нибудь помочь мне в решении этого вопроса?

4b9b3361

Ответ 1

Есть два способа исправить это:

  1. Выполните следующее в консоли MySQL:

    SET GLOBAL log_bin_trust_function_creators = 1;

  2. Добавьте следующее в файл конфигурации mysql.ini:

    log_bin_trust_function_creators = 1;

Настройка ослабляет проверку недетерминированных функций. Недетерминированные функции - это функции, которые изменяют данные (т.е. имеют операторы update, insert или delete). Для получения дополнительной информации см. Здесь.

Обратите внимание, что если двоичное ведение журнала НЕ включено, этот параметр не применяется.

Двоичная регистрация хранимых программ

Если двоичное ведение журнала не включено, log_bin_trust_function_creators не применяется.

log_bin_trust_function_creators

Эта переменная применяется, когда включено двоичное ведение журнала.

Лучший подход - это лучшее понимание и использование детерминированных объявлений для хранимых функций. Эти объявления используются MySQL для оптимизации репликации, и было бы неплохо тщательно их выбрать, чтобы репликация работала.

ДЕТЕРМИНИСТИЧЕСКАЯ Процедура считается "детерминированной", если она всегда дает один и тот же результат для одних и тех же входных параметров, а НЕ ДЕТЕРМИНИСТИЧЕСКАЯ в противном случае. Это в основном используется со строкой или математической обработкой, но не ограничивается этим.

НЕ ДЕТЕРМИНИСТИЧЕСКИЙ Противоположность "ДЕТЕРМИНИСТИЧЕСКОМУ". "Если ни DETERMINISTIC, ни NOT DETERMINISTIC не указаны в определении подпрограммы, по умолчанию используется значение NOT DETERMINISTIC. Чтобы объявить, что функция является детерминированной, необходимо явно указать DETERMINISTIC.". Таким образом, кажется, что если не будет сделано никаких заявлений, MySQl будет рассматривать функцию как "НЕ ДЕТЕРМИНИСТИЧЕСКАЯ". Это утверждение из руководства находится в противоречии с другим утверждением из другой области руководства, в котором говорится: "Когда вы создаете хранимую функцию, вы должны объявить, что она является детерминированной или не изменяет данные. В противном случае это может быть небезопасно для восстановление или репликация данных. По умолчанию для принятия оператора CREATE FUNCTION должен быть явно указан хотя бы один из DETERMINISTIC, NO SQL или READS SQL DATA. В противном случае возникает ошибка "

Я лично получил ошибку в MySQL 5.5, если нет объявления, поэтому я всегда помещаю по крайней мере одно объявление "DETERMINISTIC", "NOT DETERMINISTIC", "NO SQL" или "READS SQL DATA" независимо от других объявлений, которые у меня могут быть.

READS SQL DATA Это явно говорит MySQL, что функция будет ТОЛЬКО читать данные из баз данных, таким образом, она не содержит инструкции, которые изменяют данные, но она содержит инструкции SQL, которые читают данные (например, SELECT).

MODIFIES SQL DATA Это указывает, что подпрограмма содержит операторы, которые могут записывать данные (например, она содержит инструкции UPDATE, INSERT, DELETE или ALTER).

NO SQL Это означает, что подпрограмма не содержит операторов SQL.

СОДЕРЖИТ SQL Это указывает на то, что подпрограмма содержит инструкции SQL, но не содержит операторов, которые читают или записывают данные. Это значение по умолчанию, если ни одна из этих характеристик не указана явно. Примерами таких операторов являются SELECT NOW(), SELECT 10+ @b, SET @x = 1 или DO RELEASE_LOCK ('abc'), которые выполняют, но не читают и не записывают данные.

Обратите внимание, что есть функции MySQL, которые не являются детерминированными, например NOW(), UUID() и т.д., Которые могут давать разные результаты на разных компьютерах, поэтому пользовательская функция, содержащая такие инструкции, должна быть объявлена как NOT DETERMINISTIC., Кроме того, функция, которая считывает данные из нереплицированной схемы, явно недетерминирована. *

Оценка природы подпрограммы основана на "честности" создателя: MySQL не проверяет, что подпрограмма, объявленная как DETERMINISTIC, не содержит операторов, которые дают недетерминированные результаты. Однако неправильное указание процедуры может повлиять на результаты или производительность. Объявление недетерминированной подпрограммы как DETERMINISTIC может привести к неожиданным результатам, заставляя оптимизатор сделать неправильный выбор плана выполнения. Объявление детерминированной подпрограммы как NONDETERMINISTIC может привести к снижению производительности из-за невозможности использования доступных оптимизаций.

Ответ 2

  • Когда вы создаете сохраненную функцию, вы должны объявить, что она детерминированным или не изменяет данные. В противном случае это может быть небезопасно для восстановления или репликации данных.

  • По умолчанию для утверждения CREATE FUNCTION, по крайней мере, необходимо указать один из DETERMINISTIC, NO SQL или READS SQL DATA в явном виде. В противном случае возникает ошибка:

Чтобы устранить эту проблему, добавьте следующие строки После возврата и перед началом инструкции:

READS SQL DATA
DETERMINISTIC

Пример:

CREATE FUNCTION f2()
RETURNS CHAR(36) CHARACTER SET utf8
/*ADD HERE */
READS SQL DATA
DETERMINISTIC
BEGIN

Подробнее об этой проблеме читайте здесь

Ответ 3

следующий комментарий Дональда:

Эта переменная применяется, когда включено двоичное ведение журнала.

Все, что мне нужно было сделать:

  • отключен log_bin в my.cnf(#log_bin)
  • перезапустить mysql
  • импортировать DB
  • включить log_bin
  • перезапустить mysql

Отмените эту проблему импорта.

(Затем я рассмотрю код программиста, чтобы предложить улучшение)

Ответ 4

В Windows 10

Я просто решил эту проблему, выполнив следующее.

  1. Перейдите на my.ini и добавьте эти 2 строки в [mysqld]

    skip-log-bin
    log_bin_trust_function_creators = 1
    
  2. перезапустите службу MySQL

Ответ 5

Когда ваша функция является детерминированной, вы можете объявить ее детерминированной. Расположение ключевого слова "DETERMINISTIC" следующее.

enter image description here

Ответ 6

Попробуйте установить определитель для функции!

Поэтому вместо CREATE FUNCTION get_pet_owner вы напишите что-то похожее на CREATE DEFINER = procadmin @% FUNCTION get_pet_owner

Это должно работать, если у пользователя prodacmin есть права на создание функций/процедур.