Ошибка в триггере

Обсуждение возникших проблем, предложений и ошибок MyDAC компонентов
Ответить
Jane
Сообщения: 16
Зарегистрирован: Пт 12 сен 2014 05:57

Ошибка в триггере

Сообщение Jane » Чт 12 авг 2021 09:55

Добрый день. Для таблицы workers есть триггер после апдейта записи, сохраняющий в другую таблицу log_actions sql текст апдейта (для логгирования действий юзера):

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

CREATE TRIGGER `worker_changed_by` AFTER UPDATE ON `workers` FOR EACH ROW BEGIN
  DECLARE original_query varchar(1024);
  SET original_query = (SELECT info FROM INFORMATION_SCHEMA.PROCESSLIST WHERE id = CONNECTION_ID());
  INSERT INTO log_actions (id_user, dt, table_name, id_rec, action, sql_text) VALUES (@uid, NOW(), 'workers', NEW.id, 'U', original_query);
END;
При MyCommand.Execute например такого апдейта:

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

UPDATE workers SET fio='Щетинин' WHERE id=37
без триггера все проходит ОК, но с триггером получаю ошибку:
Project ххх.exe raised exception class EMySqlException with message '#HY000Incorrect string value: '\xD9\xE5\xF2\xE8\xED\xE8...' for column 'INFO' at row 1'.
Если напрямую апдейтить любое поле в workers в любом из БД-менеджеров или выполнить query с текстом апдейта выше, то триггер исполняется корректно, т.е. в таблицу log_actions заносится запись с sql текстом апдейта.

Если в триггере заменить (SELECT info FROM INFORMATION_SCHEMA.PROCESSLIST WHERE id = CONNECTION_ID()) на 'any_text', то ошибки нет!
Поле `log_actions`.`sql_text` varchar(1024) с CHARSET=utf8mb4.
Поле `PROCESSLIST`.`INFO` longtext с CHARSET=utf8mb3. Если заменить в триггере info на CONVERT(info USING utf8mb4), то ошибка остается.

Получается, проблема в MyDAC - как ее исправить?

Окружение: mydac_10.4.4_src + Delphi 10.4.2 + Win 10 + MySQL 8.0.25
Дайте знать, если требуется какая-либо доп.информация.
Последний раз редактировалось Jane Пт 13 авг 2021 08:29, всего редактировалось 2 раза.

ViktorV
Devart Team
Сообщения: 211
Зарегистрирован: Чт 31 июл 2014 09:52

Re: Ошибка в триггере

Сообщение ViktorV » Чт 12 авг 2021 10:49

Добрый день.

Для более быстрого и точного ответа, пожалуйста, составьте и пришлите нам небольшой пример, демонстрирующий указанное вами поведение, включающий скрипты на создание и заполнения объектов БД с помощью контактной формы:
https://devart.com/company/contactform.html

С уважением,
Виктор

Jane
Сообщения: 16
Зарегистрирован: Пт 12 сен 2014 05:57

Re: Ошибка в триггере

Сообщение Jane » Чт 12 авг 2021 13:52

Хотел использовать dbMonitor для отладки, но почему-то нет компонента TMySQLMonitor на палитре. Как его установить?

И вопрос: как выполняемый на сервере триггер влияет на результат выполнения

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

MyCommand.SQL.Text := 'UPDATE workers SET fio="Щетинин" WHERE id=37';
MyCommand.Execute;
???
Почему, если удалить триггер, код выше выполняется корректно, а с триггером выдает ошибку? Какая связь и как ее отследить?


Почему, если заменить в строке триггера
SET original_query = (SELECT info FROM INFORMATION_SCHEMA.PROCESSLIST WHERE id = CONNECTION_ID());
на
SET original_query = (SELECT HOST FROM INFORMATION_SCHEMA.PROCESSLIST WHERE id = CONNECTION_ID());
по-прежнему возникает ошибка
Project xxx.exe raised exception class EMySqlException with message '#HY000Incorrect string value: '\xD9\xE5\xF2\xE8\xED\xE8...' for column 'INFO' at row 1'.
Откуда берется это INFO, почему не HOST?

Incorrect string value: '\xD9\xE5\xF2\xE8\xED\xE8...' есть ни что иное, как слово "Щетинин"....
Последний раз редактировалось Jane Пт 13 авг 2021 08:33, всего редактировалось 5 раз.

Jane
Сообщения: 16
Зарегистрирован: Пт 12 сен 2014 05:57

Re: Ошибка в триггере

Сообщение Jane » Чт 12 авг 2021 14:32

удалить
Последний раз редактировалось Jane Пт 13 авг 2021 08:32, всего редактировалось 1 раз.

Jane
Сообщения: 16
Зарегистрирован: Пт 12 сен 2014 05:57

Re: Ошибка в триггере

Сообщение Jane » Пт 13 авг 2021 07:39

ViktorV писал(а): Чт 12 авг 2021 10:49 Добрый день.

Для более быстрого и точного ответа, пожалуйста, составьте и пришлите нам небольшой пример, демонстрирующий указанное вами поведение, включающий скрипты на создание и заполнения объектов БД с помощью контактной формы:
https://devart.com/company/contactform.html

С уважением,
Виктор
Удалось воссоздать ошибку на тестовом проекте, всё отправлено через Contact form.
Просьба рассмотреть как можно скорее.

ViktorV
Devart Team
Сообщения: 211
Зарегистрирован: Чт 31 июл 2014 09:52

Re: Ошибка в триггере

Сообщение ViktorV » Пт 13 авг 2021 09:37

Здравствуйте, Вад.

Для решения задачи, пожалуйста, установите свойство TMyConnection.Options.UseUnicode в True.
Например:

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

  MyConnection.Options.UseUnicode: = True;
Пожалуйста дайте знать если это не помогло.

С уважением,
Виктор

Jane
Сообщения: 16
Зарегистрирован: Пт 12 сен 2014 05:57

Re: Ошибка в триггере

Сообщение Jane » Пт 13 авг 2021 09:50

Виктор, спасибо. Это помогло, хотя и не совсем понятна взаимосвязь с триггером - ведь без него кириллица без проблем используется в запросах.

ViktorV
Devart Team
Сообщения: 211
Зарегистрирован: Чт 31 июл 2014 09:52

Re: Ошибка в триггере

Сообщение ViktorV » Пт 13 авг 2021 11:16

Здравствуйте, Jane.

Рады слышать, что проблема решена.

Данное поведение связано со специфической функциональностью сервера MySQL, а не нашими компонентами. Например, если в вашем примере вы будете вместо кириллицы использовать латиницу, то ошибки не будет.
Например:

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

  ParamByName('p1').AsString := 'Shetinin'; 
Для этого и существуют подобные опции как у наших продуктов, так и у всех клиентов MySQL.
При включённом свойстве UseUnicode вы сможете корректно работать с любимы данными.

С уважением,
Виктор

Jane
Сообщения: 16
Зарегистрирован: Пт 12 сен 2014 05:57

Re: Ошибка в триггере

Сообщение Jane » Пт 13 авг 2021 11:37

Спасибо за разъяснение.
Их хэлпа:
property UseUnicode:

Informs server that all data between client and server sides will be passed in Utf8 coding. Setting this option converts all fields of the TStringField type into TWideStringField that allows to work correctly with symbols of almost all languages simultaneously. On the other hand, it causes a delay in working. If the UseUnicode property is enabled, the Charset property will be ignored. The default value is False.
это приводит к задержке в работе - проясните еще насчет выделенного. Насколько значительна эта задержка?

ViktorV
Devart Team
Сообщения: 211
Зарегистрирован: Чт 31 июл 2014 09:52

Re: Ошибка в триггере

Сообщение ViktorV » Пт 13 авг 2021 12:17

Спасибо за ответ,

На современных системах данная задержка очень незначительная.
И данное незначительное уменьшение скорости работы нивелируется возможность корректно работать с любимы Unicode данными.

С уважением,
Виктор

Ответить