2012-02-10 12 views
5

He escrito un activador para insertar una fila en la tabla b después de una operación en la tabla a. Por alguna razón, no tiene ningún efecto si agrego este disparador 'después de insertar' y luego inserto una fila. Sin embargo, funciona si agrego el activador como 'después de la actualización' y actualizo la fila.MYSQL Trigger funciona si uso 'después de la actualización' pero no 'después de insertar'?

Aquí está el código de activación. Cuando reemplazo 'DESPUÉS DE ACTUALIZAR' con 'DESPUÉS DE INSERTAR', y hago una inserción, entonces no ocurre nada cuando inserto una nueva fila. No obtengo ningún error al crear el disparador, y no estoy tratando de actualizar la misma tabla en la que se está estableciendo el disparador. ¡Se agradece cualquier ayuda! gracias, 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

Consulte esta respuesta que parece aplicarse a su situación también: http://stackoverflow.com/a/9097459/870122 – perissf

+0

Intente reproducir este comportamiento sin desencadenar. Ejecute la instrucción SELECT. ¿Devolverá alguna fila? – Devart

+0

@perissf - gracias por su respuesta. ese problema es sobre "Dentro de una función almacenada o activador, no está permitido modificar una tabla que ya está siendo utilizada (para lectura o escritura) por la declaración que invocó la función o desencadenante". Si bien estoy leyendo la tabla jiraissue, no la estoy actualizando. Y eso no explica por qué parece funcionar si lo ejecuto 'DESPUÉS DE ACTUALIZAR', pero no 'DESPUÉS DE INSERTAR'? – jen

Respuesta

1

En MySQL 5.5.20 con tablas InnoDB i han reproducido su situación en una prueba simplificada. tanto, la inserción usando un resultado de la mesa de disparo que se refería a la nueva fila alreay y directamente insertando el uso de los nuevos valores funcionó bien

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 ; 

fuego el gatillo

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

insertada directamente por los valores NUEVO

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

inserta desde consecuencia SELECT

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) 

Esto funciona tanto para autoincremento como para valores explícitamente insertados. Su problema debe estar en otro lugar

Cuestiones relacionadas