2013-08-17 2 views
5

Документация говорит, чтонепредвиденная ошибка в триггере при экспорте

Там не может быть двух триггеров для данной таблицы, которые имеют то же самое время действия запуска и события.

Я использую mysql 5.5.16. Я создал два триггера. upd_check1 и sale_tri. Я уверен, что мои два триггера выполняют две разные таблицы на событии INSERT. Но почему я получаю эту ошибку в обоих триггерах. когда я пытаюсь экспортировать базу данных (phpmyadmin не показывает ошибку, но mysql workbench, heidisql, браузер запросов показывает ошибку).

SQL Error (1235): Эта версия MySQL не поддерживает 'множественный триггеры одновременно действия и события для одной таблицы'

Вот мой upd_check1 спускового

-- 
-- Triggers `product_purchases` 
-- 
DROP TRIGGER IF EXISTS `upd_check1`; 
DELIMITER // 
CREATE TRIGGER `upd_check1` AFTER INSERT ON `product_purchases` 
FOR EACH ROW BEGIN 
    DECLARE X INTEGER; 
    SET X = (SELECT product_id FROM product_stock where product_id = NEW.product_id); 
    IF NEW.product_id =X THEN 
    UPDATE 
    product_stock AS S, 
    product_purchase_item AS I, 
    product_purchases AS P 
    SET 
    S.product_total_quantity=S.product_total_quantity+I.quantity 
    WHERE 
    S.product_id=I.product_id 
    AND 
    I.product_purchase_item_id=P.product_purchase_item_id 
    AND 
    P.product_purchase_id=NEW.product_purchase_id; 
    ELSE 
    INSERT INTO 
     product_stock (product_id,product_total_quantity) 
    SELECT 
     product_id, quantity 
    FROM 
     product_purchase_item 
    WHERE 
     product_purchase_item_id=NEW.product_purchase_item_id; 
    END IF; 

    END 
// 
DELIMITER ; 

И вот мой sale tri триггер

-- 
-- Triggers `product_sales` 
-- 
DROP TRIGGER IF EXISTS `sale_tri`; 
DELIMITER // 
CREATE TRIGGER `sale_tri` AFTER INSERT ON `product_sales` 
FOR EACH ROW BEGIN 
     DECLARE X INTEGER; 

     SET X = (SELECT product_id FROM product_stock where product_id = NEW.product_id); 
     IF NEW.product_id =X THEN 
      update product_stock as s, 
      product_sale_item as i, 
      product_sales as p 
     SET s.product_total_quantity=s.product_total_quantity-i.quantity 
     WHERE s.product_id=i.product_id AND 
      i.product_sale_item_id=p.product_sales_item_id AND 
      p.product_sales_id=NEW.product_sales_id; 
     END IF; 
    END 
// 
DELIMITER ; 
+1

Вы уверены, что в этих таблицах уже нет триггеров? –

+0

Да. только выше двух триггеров, которые я использую. – Imran

+0

У вас есть ошибка при экспорте * БД или при импорте *? –

ответ

3

Если оба

SHOW TRIGGERS 

и

SELECT * from INFORMATION_SCHEMA.TRIGGERS 

отображать только один ПОСЛЕ INSERT триггера для каждой таблицы, следующий шаг, чтобы убедиться, что нет коррупции в самом определении триггера.

MySQL хранит триггеры в *.TRG и *.TRN файлах в каталоге данных, а формат является текстовым, поэтому визуальный осмотр может помочь проверить, сколько триггеров действительно определено.

Вы должны увидеть что-то похожее на это для таблицы:

[email protected]:test> more product_sales.TRG 
TYPE=TRIGGERS 
triggers='CREATE DEFINER=`root`@`localhost` TRIGGER `sale_tri` AFTER INSERT ON `product_sales`\n FOR EACH ROW BEGIN\n  D 
ECLARE X INTEGER;\n ... END' 
sql_modes=0 
definers='[email protected]' 
client_cs_names='utf8' 
connection_cl_names='utf8_general_ci' 
db_cl_names='latin1_swedish_ci' 

И для этого файла имя триггера:

[email protected]:test> more sale_tri.TRN 
TYPE=TRIGGERNAME 
trigger_table=product_sales 

несколько триггеров в файле TRG подтвердят, если определение каким-то образом поврежден (в этом случае вам, возможно, придется отказаться и создать триггеры снова), но не так, как это на самом деле стало коррумпированным.

В любом случае, никогда не редактируйте *.TRN или *.TRG файлов вручную.

Смежные вопросы