powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / В чем ошибка в триггере after insert?
10 сообщений из 10, страница 1 из 1
В чем ошибка в триггере after insert?
    #38286342
Здравствуйте.

Создал триггер:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
DELIMITER ;
USE antilopa2;

DELIMITER $$
DROP TRIGGER IF EXISTS antilopa2.`after_insert_products` 
$$
CREATE
DEFINER = CURRENT_USER
TRIGGER antilopa2.after_insert_products
AFTER INSERT
ON antilopa2.ytgb1_virtuemart_products
FOR EACH ROW
BEGIN
  SET @product_id = NEW.virtuemart_product_id;
  SET @total_retail_price = IFNULL(
	(SELECT
		SUM(IFNULL(product_price, 0))
	FROM `ytgb1_virtuemart_product_prices`
	WHERE virtuemart_product_id = @product_id AND virtuemart_shoppergroup_id = 0)
	,0);
  SET @media_exist = IFNULL(
    (SELECT
      COUNT(*) AS n
    FROM ytgb1_virtuemart_products p
    JOIN `ytgb1_virtuemart_product_medias` pm USING(virtuemart_product_id) 
    JOIN `ytgb1_virtuemart_medias` m USING(virtuemart_media_id)
    WHERE virtuemart_product_id = @product_id
      AND NOT(file_type='product' AND file_title = '' OR  file_url_thumb = '' OR  file_url_thumb = '0')
      ),0);

  IF @total_retail_price <= 0 THEN
    UPDATE ytgb1_virtuemart_products
    SET published = 0
    WHERE virtuemart_product_id = @product_id;
  ELSE
    IF @media_exist > 0 THEN
      UPDATE ytgb1_virtuemart_products
      SET published = 1
      WHERE virtuemart_product_id = @product_id;
    ELSE
      UPDATE ytgb1_virtuemart_products
      SET published = 0
      WHERE virtuemart_product_id = @product_id;
    END IF;
  END IF;

END
$$


при попытке создать товар появляются ошибки:
авторvmError: VmTableData::store failed - Duplicate entry '0' for key 'PRIMARY' SQL=INSERT INTO `ytgb1_virtuemart_products_ru_ru` (`virtuemart_product_id`,`product_name`,`product_s_desc`,`product_desc`,`metadesc`,`metakey`,`customtitle`,`slug`) VALUES ('0','тестт5','','','','','','testt5')
vmError: Product store TableProducts: :store failed
Can't update table 'ytgb1_virtuemart_products' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. SQL=INSERT INTO `ytgb1_virtuemart_products` (`virtuemart_product_id`,`virtuemart_vendor_id`,`product_parent_id`,`product_sku`,`product_weight`,`product_weight_uom`,`product_length`,`product_width`,`product_height`,`product_lwh_uom`,`product_url`,`product_in_stock`,`product_ordered`,`low_stock_notification`,`product_available_date`,`product_availability`,`product_special`,`product_sales`,`product_unit`,`product_packaging`,`product_params`,`intnotes`,`metarobot`,`metaauthor`,`layout`,`published`,`created_on`,`created_by`,`modified_on`,`modified_by`) VALUES ('0','1','0','','0','KG','0','0','0','CM','','0','0','0','2013-06-05','','0','0','KG','','min_order_level=\"\"|max_order_level=\"\"|product_box=\"\"|','','','','0','1','2013-06-05 07:47:59','42','2013-06-05 07:47:59','42')
vmError: You are not an administrator or the correct vendor, storing of product cancelled


Помогите пожалуйста понять, отчего.
Благодарю
...
Рейтинг: 0 / 0
В чем ошибка в триггере after insert?
    #38286365
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Борис Гаркун,

Тебе перевести текст ошибки???

in stored function/trigger because it is already used by statement which invoked this stored function/trigger. SQL=INSERT INTO


ЗЫ

тригер БИФО .... и переделка кода под бифо
...
Рейтинг: 0 / 0
В чем ошибка в триггере after insert?
    #38286367
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Борис Гаркун,

ну а то что дубли примари кея , ещо одна ошибка ...тут думаю всё ясно...
...
Рейтинг: 0 / 0
В чем ошибка в триггере after insert?
    #38286372
Вот так надо было:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
USE antilopa2;

DELIMITER $$
DROP TRIGGER IF EXISTS antilopa2.`before_insert_products` 
$$
CREATE
DEFINER = CURRENT_USER
TRIGGER antilopa2.before_insert_products
BEFORE INSERT
ON antilopa2.ytgb1_virtuemart_products
FOR EACH ROW
BEGIN
  SET @product_id = NEW.virtuemart_product_id;
  SET @total_retail_price = IFNULL(
	(SELECT
		SUM(IFNULL(product_price, 0))
	FROM `ytgb1_virtuemart_product_prices`
	WHERE virtuemart_product_id = @product_id AND virtuemart_shoppergroup_id = 0)
	,0);
  SET @media_exist = IFNULL(
    (SELECT
      COUNT(*) AS n
    FROM ytgb1_virtuemart_products p
    JOIN `ytgb1_virtuemart_product_medias` pm USING(virtuemart_product_id) 
    JOIN `ytgb1_virtuemart_medias` m USING(virtuemart_media_id)
    WHERE virtuemart_product_id = @product_id
      AND NOT(file_type='product' AND file_title = '' OR  file_url_thumb = '' OR  file_url_thumb = '0')
      ),0);

  IF @total_retail_price <= 0 THEN
    SET NEW.published = 0;
  ELSE
    IF @media_exist > 0 THEN
      SET NEW.published = 1;
    ELSE
      SET NEW.published = 0;
    END IF;
  END IF;

END
$$

...
Рейтинг: 0 / 0
В чем ошибка в триггере after insert?
    #38286478
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Борис ГаркунВот так надо было:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
USE antilopa2;

DELIMITER $$
DROP TRIGGER IF EXISTS antilopa2.`before_insert_products` 
$$
CREATE
DEFINER = CURRENT_USER
TRIGGER antilopa2.before_insert_products
BEFORE INSERT
ON antilopa2.ytgb1_virtuemart_products
FOR EACH ROW
BEGIN
  SET @product_id = NEW.virtuemart_product_id;
  SET @total_retail_price = IFNULL(
	(SELECT
		SUM(IFNULL(product_price, 0))
	FROM `ytgb1_virtuemart_product_prices`
	WHERE virtuemart_product_id = @product_id AND virtuemart_shoppergroup_id = 0)
	,0);
  SET @media_exist = IFNULL(
    (SELECT
      COUNT(*) AS n
    FROM ytgb1_virtuemart_products p
    JOIN `ytgb1_virtuemart_product_medias` pm USING(virtuemart_product_id) 
    JOIN `ytgb1_virtuemart_medias` m USING(virtuemart_media_id)
    WHERE virtuemart_product_id = @product_id
      AND NOT(file_type='product' AND file_title = '' OR  file_url_thumb = '' OR  file_url_thumb = '0')
      ),0);

  IF @total_retail_price <= 0 THEN
    SET NEW.published = 0;
  ELSE
    IF @media_exist > 0 THEN
      SET NEW.published = 1;
    ELSE
      SET NEW.published = 0;
    END IF;
  END IF;

END
$$


ага :)
...
Рейтинг: 0 / 0
В чем ошибка в триггере after insert?
    #38442114
alex564657498765453ага :)
Здравствуйте. Возникла подобная ошибка, когда MYSQL говорит, что Can't update table 'ytgb1_virtuemart_products' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

Ситуация такая. Есть запрос вида:
Код: sql
1.
2.
3.
4.
5.
6.
INSERT INTO ytgb1_virtuemart_product_medias(...)
SELECT  
	...
FROM `ytgb1_virtuemart_medias` m
JOIN ytgb1_virtuemart_products pp
...


На таблицу ytgb1_virtuemart_product_medias создан триггер, который после INSERT должен обновлять ytgb1_virtuemart_products. Видимо поэтому всплывает указанная ошибка.

В данном случае триггер, делающий изменения в таблице ytgb1_virtuemart_products, изначально создан на другую таблицу, по результатам проверки изменений которой производится попытка изменить ytgb1_virtuemart_products. Т.е. предыдущий вариант SET NEW.publushed = 1; (поле publushed принадлежит той самой ytgb1_virtuemart_products)не подходит.

Заметил, что если просто вставлять значения в изменяемую таблицу (без selecta, в котором фигурирует ytgb1_virtuemart_products), то триггер срабатывает и меняет ytgb1_virtuemart_products.

Может надо выгружать select во временную таблицу и по её содержимому уже делать INSERT в таблицу ytgb1_virtuemart_product_medias или можно как-то подправить триггер?
...
Рейтинг: 0 / 0
В чем ошибка в триггере after insert?
    #38460183
Может кто подскажет как правильно разрешить ситуацию в предпоследнем посте?
...
Рейтинг: 0 / 0
В чем ошибка в триггере after insert?
    #38460200
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Борис Гаркунвыгружать select во временную таблицу и по её содержимому уже делать INSERT в таблицу ytgb1_virtuemart_product_mediasили убирайте триггер вообще и делайте (инсерт + всю последующую обработку) хранимкой.
...
Рейтинг: 0 / 0
В чем ошибка в триггере after insert?
    #38460216
tanglir,

наверно можно сделать триггер, который запускает хранимку, которой в параметрах передаются id товара, который надо обработать?
...
Рейтинг: 0 / 0
В чем ошибка в триггере after insert?
    #38460336
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Борис Гаркун,

ну попробуйте так, о результатах отпишитесь :)
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / В чем ошибка в триггере after insert?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]