от
У меня возникли проблемы с одним из моих триггеров BEFORE INSERT, так как я обновился до MariaDB 10.4.6. Триггер определяется следующим образом (удаление ненужной части)
 CREATE TRIGGER `trg_bins_stock`
 BEFORE INSERT ON `stock`
 FOR EACH ROW
 BEGIN  

DECLARE maxprice DOUBLE DEFAULT NULL;
DECLARE errormsg VARCHAR(255) DEFAULT '';

select  MAX(price)  into maxprice 
FROM view_articles
where view_articles.id_ref = NEW.id_ref;

IF (maxprice is null) THEN

  SET errormsg = CONCAT("INSERT ERROR : missing line in view_articles [art ref :  ",  NEW.id_ref ,  "]");

  SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = errormsg; 

END IF;

END
Вставляя в таблицу «stock», я получу свою ошибку, даже если не должна, например, с сообщением «INSERT ERROR: отсутствует строка в view_articles [art ref: 11757]» Запрос:
select  MAX(price)  
    FROM view_articles
    where view_articles.id_ref = 11757;
Не возвращает ноль, поэтому я не должен вызывать эту ошибку. Что я тестировал до сих пор: значение «maxprice» в триггере фактически равно NULL (поэтому это не проблема с предложением if). если я изменю триггер, чтобы поместить 11757 вместо NEW.id_ref в запросе выбора, maxprice не будет NULL. если я создаю таблицу "table_articles", аналогичную моему представлению "view_articles", и делаю INSERT INTO table_articles SELECT * FROM view_articles, затем измените мой триггер, чтобы использовать таблицу вместо view, maxprice также не равно нулю. Дополнительная информация: Режим Sql установлен на «NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION». Пользователь, который создал представление, таблицу, триггер и который используется для вставки в таблицу, является одним и тем же и имеет «предоставить все привилегии для». Протестировано с mariadb 10.4.6 (обновление с 10.1 после страницы с инструкциями по обновлению) на Debian 9 и новой установкой той же версии на машине с Windows, с загрузкой базы данных из дампа. РЕДАКТИРОВАТЬ с большим количеством информации, тестов и Обходной путь: view_articles определяется (упрощенно) следующим образом:
CREATE VIEW view_articles  AS 
 SELECT articles2.id_ref as id_ref, articles2.pricing as price
  from articles2 
 UNION 
SELECT articles.id_article as id_ref, articles.price as price 
  from articles
Если бы я использовал этот оператор непосредственно в триггере вместо представления, у меня все еще остается та же проблема, но это работает:
IF(new.id_ref 
Итак, теперь запрещено использовать представление с предложением UNION в триггере? Или это ошибка? Я не очень доволен своим обходным решением, потому что когда-нибудь у меня могут быть отрицательные идентификаторы в таблице «статей» и положительные в «статьях2», даже если сейчас это не так. Поэтому я все еще приветствую более элегантные решения.              

Ваш ответ

Отображаемое имя (по желанию):
Конфиденциальность: Ваш электронный адрес будет использоваться только для отправки уведомлений.
Анти-спам проверка:
Чтобы избежать проверки в будущем, пожалуйста войдите или зарегистрируйтесь.

2 Ответы

0 голосов
от
Я не могу воспроизвести проблему:
MariaDB [(none)]
0 голосов
от
Это ошибка, затрагивающая версии 10.2, 10.3 и 10.4 MariaDB. Необходимо обойти это, пока ошибка не будет исправлена. Ссылка на трекер ошибок MariaDB: https://jira.mariadb.org/browse/MDEV-19975     
...