Почему значения NEW не сохраняются в SQL триггере BEFORE UPDATE в MariaDB?

Как исправить значение переменной NEW.object_id в триггере, чтобы оно корректно использовалось без дополнительного объявления и присвоения через SET? Также почему при выводе отладочной информации с помощью дебага, значения выглядят некорректно?
  • 4 февраля 2024 г. 12:38
Ответы на вопрос 2
В MariaDB, когда вы создаете триггер BEFORE UPDATE, вы имеете возможность изменить значения столбцов, которые будут обновлены, путем присвоения новых значелений переменным `NEW.column_name`. Манипуляции с этими переменными напрямую влияют на данные, которые будут записаны в базу данных после выполнения триггера.

Если значения `NEW` не сохраняются, возможны следующие причины:
1. Присваивание значений происходит некорректно.
2. В теле триггера возникает ошибка, из-за которой он завершается раньше времени.
3. Триггер перезаписывается другим триггером или операциями, выполняемыми после BEFORE UPDATE.

Чтобы исправить значение переменной `NEW.object_id`, вам нужно написать такую строку в теле триггера BEFORE UPDATE:

```sql
SET NEW.object_id = новое_значение;
```

где `новое_значение` - это значение, которое вы хотите присвоить `object_id` перед обновлением строки.

Вот пример триггера, который изменяет значение в колонке `object_id` перед тем, как обновление произойдет:

```sql
CREATE TRIGGER before_update_trigger
BEFORE UPDATE ON ваша_таблица
FOR EACH ROW
BEGIN
    -- Здесь могут быть различные проверки или расчеты
    SET NEW.object_id = новое_значение;
    -- Переменная NEW.object_id теперь содержит новое значение,
    -- которое будет вставлено в объект во время обновления
END;
```

Если вы сталкиваетесь с тем, что при выводе отладочной информации значения `NEW.column_name` выглядят некорректно, возможные причины могут быть следующие:
- Вывести значения переменных `NEW.column_name` напрямую в MariaDB невозможно, так как MariaDB не предоставляет встроенных процедур для отладки триггеров, наподобие `DBMS_OUTPUT.PUT_LINE` в Oracle. Чтобы визуализировать эти значения, вы можете использовать временную таблицу для записи отладочной информации.
- Значения переменных `NEW.column_name` изменяются в другом месте в рамках того же триггера, и вы выводите не те значения, которые ожидали.

Убедитесь, что вы не столкнулись с логической ошибкой в коде триггера и что обновление значений переменных производится в правильном порядке.
Для всех полей, которые не указаны явно в запросе на добавление (то есть поля явно перечислены в предложении INSERT, но это не все поля таблицы, есть неупомянутые в списке поля), в шаблон вставляемой записи помещается указанное в структуре таблицы значение по умолчанию. Если таковое отсутствует, то в шаблон помещается NULL. 

Поле-автоинкремент не имеет значения по умолчанию. Генерация нового автоинкрементного значения производится после выполнения всех BEFORE триггеров. Отсюда и NULL в указанной ситуации.

PS. https://xyproblem.info/
Похожие вопросы