Ошибка Database Error: 1418 при создании поля Разница в днях с mysql 8.0.36

Ответить
Forester
Сообщения: 3
Зарегистрирован: 13 дек 2019, 20:16
Имя: Анатолий Клименков
Откуда: Беларусь Минск

Ошибка Database Error: 1418 при создании поля Разница в днях с mysql 8.0.36

Сообщение Forester »

1. При выполнении переезда с одного сервера с mysql 5 на сервер с mysql 8.0.36 возникла ошибка (Database Error: 1418) переноса базы данных.
Переезд осуществлялся по инструкции https://docs.rukovoditel.net.ru/index.php?p=7
2. После чего выполнена чистая установка на сервер с mysql 8.0.36
3. При создании поля Разница в днях и тому подобных появляется ошибка:

Database Error: 1418 - 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)
Query: CREATE FUNCTION `rukovoditel_days_diff`(`start_date` INT, `end_date` INT, `exclude_days` VARCHAR(64), `exclude_last_day` TINYINT(1), `exclude_holidays` TINYINT(1)) RETURNS int(11) BEGIN DECLARE days_diff INT; DECLARE inc_days TINYINT; SET days_diff=0; IF start_date>0 and end_date>0 and end_date>=start_date THEN #skip while if no restriction IF length(exclude_days)=0 and exclude_holidays!=1 THEN SET days_diff = (end_date-start_date)/86400; IF exclude_last_day!=1 THEN SET days_diff = days_diff+1; END IF; RETURN days_diff; END IF; WHILE FROM_UNIXTIME(start_date,'%Y-%m-%d')<=FROM_UNIXTIME(end_date,'%Y-%m-%d') DO SET inc_days=1; #exclude day of week IF find_in_set(DAYOFWEEK(FROM_UNIXTIME(start_date,'%Y-%m-%d')),exclude_days) THEN SET inc_days=0; END IF; #exclude last day IF exclude_last_day=1 and FROM_UNIXTIME(start_date,'%Y-%m-%d')=FROM_UNIXTIME(end_date,'%Y-%m-%d')THEN SET inc_days=0; END IF; #exclude holidays IF exclude_holidays=1 THEN SET @start_date_var = FROM_UNIXTIME(start_date,'%Y-%m-%d'); SET @is_holiday = (select count(*) from app_holidays h where h.start_date<= @start_date_var and h.end_date>=@start_date_var); if @is_holiday!=0 THEN SET inc_days=0; END if; END IF; IF inc_days=1 THEN SET days_diff =days_diff+1; END IF; SET start_date = start_date+86400; END WHILE; END IF; RETURN days_diff; END;
Page: /index.php?module=entities/fields_configuration
#0 includes/functions/database.php(99): mysqli_query()
#1 includes/classes/fieldstypes/fieldtype_days_difference.php(165): db_query()
#2 includes/classes/fieldstypes/fieldtype_days_difference.php(53): fieldtype_days_difference::prepare_procedure()
#3 modules/entities/actions/fields_configuration.php(36): fieldtype_days_difference->get_configuration()
#4 index.php(31): require('/home/exhibiti/...')
#5 {main}

с данным вопросом был озадачен хостер и получен следующий ответ:

Выполнили дополнительный анализ.
Причина ошибки указанной на вашем скриншоте является в том, что функция "rukovoditel_days_diff" не имеет одного из трех атрибутов: DETERMINISTIC, NO SQL или READS SQL DATA, на виртуальном хостинге для всего сервера включено (binary logging) с параметром "log_bin_trust_function_creators = 0".

Исходя из ошибки, функция "rukovoditel_days_diff" выполняет чтение из таблицы "app_holidays" без атрибута. О чем и сообщается в ошибке: 1418 - 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)
Ввиду того, что на сервере установлен параметр "log_bin_trust_function_creators = 0" это не позволяет пользователям создавать функции и процедуры без указания атрибутов.
Данные меры выполнены в целях безопасности.

Для решения проблемы вам необходимо указать один из атрибутов "DETERMINISTIC, NO SQL, or READS SQL" для вашей функции.
Например "READS SQL DATA" :
CREATE FUNCTION `rukovoditel_days_diff`(`start_date` INT, `end_date` INT, `exclude_days` VARCHAR(64), `exclude_last_day` TINYINT(1), `exclude_holidays` TINYINT(1)) RETURNS int(11)
READS SQL DATA
BEGIN
DECLARE days_diff INT;

с просьбой передать данную информацию разработчикам.

P.S. в версии Mysql 5.7 и более ранних версиях не было строгого требования для функций и процедур, на наличие атрибуты DETERMINISTIC, NO SQL или READS SQL DATA при включенном (binary logging).
Аватара пользователя
support
Техническая поддержка
Сообщения: 9348
Зарегистрирован: 19 окт 2014, 18:22
Имя: Харчишин Сергей
Откуда: Крым, Евпатория

Re: Ошибка Database Error: 1418 при создании поля Разница в днях с mysql 8.0.36

Сообщение support »

Добавил READS SQL DATA
Файлы из архива замените в includes\classes\fieldstypes\
Откройте форму редактирования для поля "Разница в днях", функция rukovoditel_days_diff должна создаться автоматически.
Сообщите результат.
Вложения
fieldstypes_fix.zip
(14.24 КБ) 54 скачивания
Forester
Сообщения: 3
Зарегистрирован: 13 дек 2019, 20:16
Имя: Анатолий Клименков
Откуда: Беларусь Минск

Re: Ошибка Database Error: 1418 при создании поля Разница в днях с mysql 8.0.36

Сообщение Forester »

Здравствуйте,
файлы обновил, при создании поля Разница в днях и ему подобных получаю следующую ошибку:
Database Error: 1419 - You do not have the SUPER privilege and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)
Query: CREATE FUNCTION `rukovoditel_days_diff`(`start_date` INT, `end_date` INT, `exclude_days` VARCHAR(64), `exclude_last_day` TINYINT(1), `exclude_holidays` TINYINT(1)) RETURNS int(11) READS SQL DATA BEGIN DECLARE days_diff INT; DECLARE inc_days TINYINT; SET days_diff=0; IF start_date>0 and end_date>0 and end_date>=start_date THEN #skip while if no restriction IF length(exclude_days)=0 and exclude_holidays!=1 THEN SET days_diff = (end_date-start_date)/86400; IF exclude_last_day!=1 THEN SET days_diff = days_diff+1; END IF; RETURN days_diff; END IF; WHILE FROM_UNIXTIME(start_date,'%Y-%m-%d')<=FROM_UNIXTIME(end_date,'%Y-%m-%d') DO SET inc_days=1; #exclude day of week IF find_in_set(DAYOFWEEK(FROM_UNIXTIME(start_date,'%Y-%m-%d')),exclude_days) THEN SET inc_days=0; END IF; #exclude last day IF exclude_last_day=1 and FROM_UNIXTIME(start_date,'%Y-%m-%d')=FROM_UNIXTIME(end_date,'%Y-%m-%d')THEN SET inc_days=0; END IF; #exclude holidays IF exclude_holidays=1 THEN SET @start_date_var = FROM_UNIXTIME(start_date,'%Y-%m-%d'); SET @is_holiday = (select count(*) from app_holidays h where h.start_date<= @start_date_var and h.end_date>=@start_date_var); if @is_holiday!=0 THEN SET inc_days=0; END if; END IF; IF inc_days=1 THEN SET days_diff =days_diff+1; END IF; SET start_date = start_date+86400; END WHILE; END IF; RETURN days_diff; END;
Page: /index.php?module=entities/fields_configuration
#0 includes/functions/database.php(99): mysqli_query()
#1 includes/classes/fieldstypes/fieldtype_days_difference.php(166): db_query()
#2 includes/classes/fieldstypes/fieldtype_days_difference.php(53): fieldtype_days_difference::prepare_procedure()
#3 modules/entities/actions/fields_configuration.php(36): fieldtype_days_difference->get_configuration()
#4 index.php(31): require('/home/exhibiti/...')
#5 {main}

дополнительно отправил запрос хостеру т.к. предложенное им решение судя по всему не сработало
Аватара пользователя
support
Техническая поддержка
Сообщения: 9348
Зарегистрирован: 19 окт 2014, 18:22
Имя: Харчишин Сергей
Откуда: Крым, Евпатория

Re: Ошибка Database Error: 1418 при создании поля Разница в днях с mysql 8.0.36

Сообщение support »

Ну это уже нет прав на создание функций.
Forester
Сообщения: 3
Зарегистрирован: 13 дек 2019, 20:16
Имя: Анатолий Клименков
Откуда: Беларусь Минск

Re: Ошибка Database Error: 1418 при создании поля Разница в днях с mysql 8.0.36

Сообщение Forester »

как итог, если осуществляется установка (переезд) на виртуальный хостинг с установленным MySQL 8 версии для работы данных полей требуется установка параметра log_bin_trust_function_creators на 1, что на виртуальных хостингах встречается редко.
Аватара пользователя
ivasha
Сообщения: 18
Зарегистрирован: 24 июл 2020, 09:39
Имя: Иван Максин
Откуда: Ковров
Контактная информация:

Re: Ошибка Database Error: 1418 при создании поля Разница в днях с mysql 8.0.36

Сообщение ivasha »

Тоже столкнулся с такой проблемой.
Если вы используете свой сервер и есть доступ в конфигурации mysql, то необходимо отключить ведение бинарного лога.
Делается это в конфиге mysql.conf.
В Ubuntu Server конфиги разнесены. В конфиге /etc/mysql/mysql.conf/mysqld.cnf в секцию [mysqld] добавьте строчку
log-bin-trust-function-creators = 1

Код: Выделить всё

[mysqld]
log-bin-trust-function-creators = 1
Ответить