2012-02-10 30 views
5

Tôi đã viết trình kích hoạt để chèn một hàng vào bảng b sau một thao tác trên bảng a. Vì lý do nào đó, nó không có tác dụng nếu tôi thêm trình kích hoạt này 'sau khi chèn' và sau đó chèn một hàng. Tuy nhiên, nó hoạt động nếu tôi thêm trình kích hoạt là 'sau khi cập nhật' và cập nhật hàng.Trình kích hoạt MYSQL hoạt động nếu tôi sử dụng 'sau khi cập nhật' nhưng không hoạt động 'sau khi chèn'?

Đây là mã kích hoạt. Khi tôi thay thế 'SAU KHI CẬP NHẬT' với 'SAU CH INSN', và thực hiện chèn, thì không có gì xảy ra khi tôi chèn một hàng mới. Tôi không nhận được lỗi khi tạo trình kích hoạt và tôi không cố gắng cập nhật cùng một bảng mà trình kích hoạt đang được đặt. Bất kỳ trợ giúp nào được đánh giá cao! cảm ơn, Jen

drop trigger if exists insertUndecided; 
DELIMITER // 
CREATE TRIGGER insertUndecided 
    AFTER UPDATE ON jiraissue 
    FOR EACH ROW 
    BEGIN 
     insert into nodeassociation (SOURCE_NODE_ID, SOURCE_NODE_ENTITY, SINK_NODE_ID, SINK_NODE_ENTITY, ASSOCIATION_TYPE, SEQUENCE) 
    select 
     NEW.id as SOURCE_NODE_ID, 
     'Issue' as SOURCE_NODE_ENTITY, 
     (select pv.id from projectversion pv 
     where pv.vname='undecided' 
     and pv.project=NEW.project) as SINK_NODE_ID, 
     'Version' as SINK_NODE_ENTITY, 
     'IssueFixVersion' as ASSOCIATION_TYPE, 
     NULL as SEQUENCE 

    from dual where exists 
     (select pkey from jiraissue 
     where id=NEW.id and id not in 
      (select distinct source_node_id from nodeassociation 
       where source_node_entity='Issue' and SINK_NODE_ENTITY='Version' 
       and ASSOCIATION_TYPE='IssueFixVersion')); 

END;// 

DELIMITER ; 
+0

Xem câu trả lời này dường như cũng áp dụng cho trường hợp của bạn: http://stackoverflow.com/a/9097459/870122 – perissf

+0

Cố gắng tái tạo hành vi này mà không cần kích hoạt. Thực hiện câu lệnh SELECT. Nó sẽ trả về bất kỳ hàng nào? – Devart

+0

@perissf - cảm ơn câu trả lời của bạn. vấn đề đó liên quan đến "Trong một hàm hoặc trình kích hoạt được lưu trữ, nó không được phép sửa đổi một bảng đã được sử dụng (để đọc hoặc viết) bằng câu lệnh đã gọi hàm hoặc trình kích hoạt." Trong khi tôi thực sự đọc bảng jiraissue, tôi không cập nhật nó. Và điều đó không giải thích tại sao nó có vẻ hoạt động nếu tôi chạy nó 'SAU KHI CẬP NHẬT', nhưng không phải 'SAU CH INSN'? – jen

Trả lời

1

On MySQL 5.5.20 với các bảng InnoDB tôi đã sao chép tình hình của bạn trong một thử nghiệm đơn giản. cả, chèn sử dụng kết quả từ bảng kích hoạt mà là đề cập đến hàng mới alreay và trực tiếp chèn bằng cách sử dụng các giá trị MỚI làm việc tốt

CREATE TABLE test1(a1 INT NOT NULL auto_increment, b1 INT, PRIMARY KEY (a1)); 
CREATE TABLE test2(a1 INT, b1 INT); 
CREATE TABLE test3(a1 INT, b1 INT); 

DELIMITER ;; 

CREATE TRIGGER testAI AFTER INSERT ON test1 
    FOR EACH ROW BEGIN 
    INSERT INTO test2 SET a1 = NEW.a1, b1 = NEW.b1; 
    INSERT INTO test3 (a1, b1) SELECT a1, b1 FROM test1 WHERE a1 = NEW.a1; 
    END; 
;; 

DELIMITER ; 

cháy cò

INSERT INTO test1 (b1) VALUES (1),(2),(3); 

trực tiếp chèn từ các giá trị MỚI

mysql> SELECT * FROM test2; 
+------+------+ 
| a1 | b1 | 
+------+------+ 
| 1 | 1 | 
| 2 | 2 | 
| 3 | 3 | 
+------+------+ 
3 rows in set (0.00 sec) 

chèn từ CHỌN kết quả

mysql> SELECT * FROM test3; 
+------+------+ 
| a1 | b1 | 
+------+------+ 
| 1 | 1 | 
| 2 | 2 | 
| 3 | 3 | 
+------+------+ 
3 rows in set (0.00 sec) 

mysql> SELECT VERSION(); 
+-----------+ 
| VERSION() | 
+-----------+ 
| 5.5.20 | 
+-----------+ 
1 row in set (0.00 sec) 

Vì vậy, tính năng này hoạt động cho cả giá trị auto_increment và giá trị được chèn một cách rõ ràng. Vấn đề của bạn phải ở một nơi khác

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