2013-08-17 49 views
5

Tài liệu nói rằnglỗi không mong muốn trong kích hoạt khi xuất khẩu

Không thể có hai trigger cho một bảng cho rằng có thời gian hành động kích hoạt cùng và sự kiện.

Tôi sử dụng mysql 5.5.16. Tôi đã tạo hai trình kích hoạt. upd_check1sale_tri. Tôi chắc chắn rằng hai kích hoạt của tôi thực hiện hai bảng khác nhau trên sự kiện INSERT. Nhưng tại sao tôi nhận được lỗi này trong cả hai kích hoạt. khi tôi thử xuất cơ sở dữ liệu (phpmyadmin không hiển thị lỗi nhưng mysql workbench, heidisql, trình duyệt truy vấn hiển thị lỗi).

SQL Lỗi (1235): Phiên bản này của MySQL chưa hỗ trợ 'nhiều gây nên với thời gian hành động tương tự và sự kiện cho một bảng'

Ở đây tôi upd_check1 kích hoạt

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

Và tại đây, tôi kích hoạt kích hoạt

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

Bạn chắc chắn các bảng đó chưa có trình kích hoạt trên chúng? –

+0

yea. chỉ ở trên hai trình kích hoạt tôi sử dụng. – Imran

+0

Bạn gặp lỗi trong khi * xuất * DB hoặc trong khi * đang nhập *? –

Trả lời

3

Nếu cả hai

SHOW TRIGGERS 

SELECT * from INFORMATION_SCHEMA.TRIGGERS 

chỉ hiển thị một SAU INSERT kích hoạt cho mỗi bảng, bước tiếp theo là để đảm bảo không có tham nhũng trong định nghĩa kích hoạt riêng của mình.

MySQL giữ các trình kích hoạt trong các tệp *.TRG*.TRN trong thư mục dữ liệu và định dạng là văn bản, do đó, việc kiểm tra trực quan có thể giúp xác minh số lượng trình kích hoạt thực sự được xác định.

Bạn sẽ thấy một cái gì đó tương tự như sau cho bảng:

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

Và đối với những tập tin tên cò:

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

Nhiều trigger trong file TRG sẽ xác nhận nếu định nghĩa bằng cách nào đó bị hỏng (trong trường hợp đó, bạn có thể phải thả và tạo lại các trình kích hoạt), nhưng không phải nó thực sự bị hỏng như thế nào.

Trong mọi trường hợp, không bao giờ chỉnh sửa các tệp *.TRN hoặc *.TRG theo cách thủ công.

Các vấn đề liên quan