2012-02-10 10 views
5

Napisałem spust, aby wstawić wiersz do tabeli b po operacji na tabeli a. Z jakiegoś powodu nie ma żadnego efektu, jeśli dodaję ten argument "po wstawieniu", a następnie wstaw wiersz. Jednak działa, jeśli dodaję wyzwalacz jako "po aktualizacji" i zaktualizuję wiersz.Wyzwalacz MYSQL działa, jeśli używam "po aktualizacji", ale nie "po wstawieniu"?

Oto kod aktywacyjny. Kiedy zastępuję "PO AKTUALIZACJI" słowem "PO WSTAWIE" i robię wstawkę, nic się nie dzieje po wstawieniu nowego wiersza. Nie otrzymuję żadnych błędów podczas tworzenia wyzwalacza i nie próbuję aktualizować tej samej tabeli, dla której wyzwalacz jest ustawiony. Każda pomoc jest doceniana! Dzięki, 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

Zobacz tę odpowiedź, która wydaje się mieć zastosowanie w danej sytuacji, a także: http://stackoverflow.com/a/9097459/870122 – perissf

+0

Spróbuj odtworzyć ten problem bez spustu. Wykonaj instrukcję SELECT. Czy zwróci wszystkie wiersze? – Devart

+0

@perissf - dzięki za odpowiedź. problem dotyczy "W funkcji zapisanej lub wyzwalającej, nie wolno modyfikować tabeli, która jest już używana (do odczytu lub zapisu) przez instrukcję, która wywołała funkcję lub wyzwalacz". Chociaż rzeczywiście czytam tabelę jiraissue, nie aktualizuję jej. I to nie wyjaśnia, dlaczego wydaje się działać, jeśli uruchomię go po "AKTUALIZACJI", ale nie "PO WSTAWIE"? – jen

Odpowiedz

1

Na MySQL 5.5.20 z tabel InnoDB i już powielana swoją sytuację w uproszczonym teście. zarówno wkładania za pomocą rezultat z tabeli wyzwalacza, który odnosi się do nowego wiersza alreay i bezpośrednio wkładając przy użyciu nowej wartości działało dobrze

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 ; 

pożaru spust

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

wprowadzane bezpośrednio z nowymi wartościami

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

wkładane od SELECT wyniku

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) 

To działa zarówno dla wartości auto_increment, jak i jawnie wstawionych. Twój problem musi być gdzieś indziej

Powiązane problemy