2013-08-17 6 views
5

Dokumentation exportieren sagen, dassunerwartete Fehler in Trigger, wenn

Es gibt nicht zwei Trigger für eine gegebene Tabelle sein kann, die die gleiche Trigger-Aktion Zeit und Ereignis haben.

Ich verwende mysql 5.5.16. Ich habe zwei Auslöser erstellt. upd_check1 und sale_tri. Ich bin mir sicher, dass meine zwei Auslöser zwei verschiedene Tische auf INSERT Ereignis durchführen. Aber warum bekomme ich diesen Fehler in beiden Triggern. Wenn ich versuche, Export-Datenbank (phpmyadmin zeigt Fehler nicht aber mysql Workbench, Heidisql, Abfrage Browser Fehler anzeigen).

SQL-Fehler (1235): Diese Version von MySQL unterstützt noch nicht 'mehrere löst mit der gleichen Aktion Zeit und Ereignisse für eine Tabelle'

Hier meinen upd_check1 Trigger

-- 
-- 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 ; 

Und hier meine sale tri Trigger

-- 
-- 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

Sie sind sicher, dass diese Tabellen nicht bereits über Trigger verfügen? –

+0

ja. nur über zwei Trigger, die ich verwende. – Imran

+0

Sie haben einen Fehler beim * Exportieren * der DB oder beim * Importieren *? –

Antwort

3

Wenn beide

SHOW TRIGGERS 

und

SELECT * from INFORMATION_SCHEMA.TRIGGERS 

nur für jede Tabelle ein AFTER INSERT-Trigger angezeigt werden, ist der nächste Schritt, um sicherzustellen, keine Korruption in der Trigger-Definition selbst ist.

MySQL hält Trigger in *.TRG und Dateien im Datenverzeichnis, und das Format ist textuell, so dass eine visuelle Überprüfung helfen kann zu überprüfen, wie viele Trigger wirklich definiert sind.

Sie etwas ähnliches wie dies für die Tabelle sehen soll:

[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' 

Und für die Triggernamen-Datei:

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

mehrere Trigger in der TRG-Datei wird bestätigen, wenn die Definition irgendwie beschädigt (In diesem Fall müssen Sie möglicherweise die Trigger löschen und erneut erstellen), aber nicht, wie sie tatsächlich beschädigt wurde.

In keinem Fall, *.TRN oder *.TRG Dateien manuell bearbeiten.