Страница 1 из 1

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

Добавлено: Чт 12 авг 2021 09:55
Jane
Добрый день. Для таблицы 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
Дайте знать, если требуется какая-либо доп.информация.

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

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

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

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

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

Добавлено: Чт 12 авг 2021 13:52
Jane
Хотел использовать 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...' есть ни что иное, как слово "Щетинин"....

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

Добавлено: Чт 12 авг 2021 14:32
Jane
удалить

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

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

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

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

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

Добавлено: Пт 13 авг 2021 09:37
ViktorV
Здравствуйте, Вад.

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

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

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

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

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

Добавлено: Пт 13 авг 2021 09:50
Jane
Виктор, спасибо. Это помогло, хотя и не совсем понятна взаимосвязь с триггером - ведь без него кириллица без проблем используется в запросах.

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

Добавлено: Пт 13 авг 2021 11:16
ViktorV
Здравствуйте, Jane.

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

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

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

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

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

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

Добавлено: Пт 13 авг 2021 11:37
Jane
Спасибо за разъяснение.
Их хэлпа:
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.
это приводит к задержке в работе - проясните еще насчет выделенного. Насколько значительна эта задержка?

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

Добавлено: Пт 13 авг 2021 12:17
ViktorV
Спасибо за ответ,

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

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