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).
Ошибка Database Error: 1418 при создании поля Разница в днях с mysql 8.0.36
- support
- Техническая поддержка
- Сообщения: 9166
- Зарегистрирован: 19 окт 2014, 18:22
- Имя: Харчишин Сергей
- Откуда: Крым, Евпатория
Re: Ошибка Database Error: 1418 при создании поля Разница в днях с mysql 8.0.36
Добавил READS SQL DATA
Файлы из архива замените в includes\classes\fieldstypes\
Откройте форму редактирования для поля "Разница в днях", функция rukovoditel_days_diff должна создаться автоматически.
Сообщите результат.
Файлы из архива замените в includes\classes\fieldstypes\
Откройте форму редактирования для поля "Разница в днях", функция rukovoditel_days_diff должна создаться автоматически.
Сообщите результат.
- Вложения
-
- fieldstypes_fix.zip
- (14.24 КБ) 37 скачиваний
-
- Сообщения: 3
- Зарегистрирован: 13 дек 2019, 20:16
- Имя: Анатолий Клименков
- Откуда: Беларусь Минск
Re: Ошибка Database Error: 1418 при создании поля Разница в днях с mysql 8.0.36
Здравствуйте,
файлы обновил, при создании поля Разница в днях и ему подобных получаю следующую ошибку:
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}
дополнительно отправил запрос хостеру т.к. предложенное им решение судя по всему не сработало
файлы обновил, при создании поля Разница в днях и ему подобных получаю следующую ошибку:
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
- Техническая поддержка
- Сообщения: 9166
- Зарегистрирован: 19 окт 2014, 18:22
- Имя: Харчишин Сергей
- Откуда: Крым, Евпатория
Re: Ошибка Database Error: 1418 при создании поля Разница в днях с mysql 8.0.36
Ну это уже нет прав на создание функций.
-
- Сообщения: 3
- Зарегистрирован: 13 дек 2019, 20:16
- Имя: Анатолий Клименков
- Откуда: Беларусь Минск
Re: Ошибка Database Error: 1418 при создании поля Разница в днях с mysql 8.0.36
как итог, если осуществляется установка (переезд) на виртуальный хостинг с установленным MySQL 8 версии для работы данных полей требуется установка параметра log_bin_trust_function_creators на 1, что на виртуальных хостингах встречается редко.