2013-07-26 4 views
0

Если у меня есть две таблицы A и B как с триггерами вставок на них.MySQL Chained Triggers

Если триггер таблицы вставляет строку в B, то выполняет обновление, когда будет срабатывать триггер B? Сразу же на вставке или он будет ждать завершения триггера A?

с использованием псевдо псевдокода было бы

A Trigger Starts 
    A Trigger Inserts Row into B 
    A Trigger Updates B 
A Trigger Ends 

B Trigger Fires (after insert) 

или

A Trigger Starts 
    A Trigger Inserts Row into B 
    B Trigger Fires (after insert) 
    A Trigger Updates B 
A Trigger Ends 
+1

Зачем вставлять в программу upd на B? Вы должны опубликовать, что вы на самом деле пытаетесь сделать. Я уверен, что это можно решить по-другому. – fancyPants

+0

Вопрос только в том, что если бы получилось триггер Завершился первый, у меня был бы хороший эффект домино, который мурлыкал бы через стопку столовых обновлений - если бы у меня не было потенциального беспорядка, всегда колеблющегося на краю катастрофы. –

ответ

1

Ну вы могли бы уже проверил его самостоятельно, используя таблицу журнала (general_log не поможет с этим) с кодом как этот

Таблицы схемы

CREATE TABLE a (id INT); 
CREATE TABLE b (id INT); 
CREATE TABLE c (id INT); 
DROP TABLE IF EXISTS tg_log; 
CREATE TABLE tg_log 
(
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    dt TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 
    message VARCHAR(512) 
); 

Триггеры

DROP TRIGGER IF EXISTS tg_a; 
DELIMITER $$ 
CREATE TRIGGER tg_a 
AFTER INSERT ON a 
FOR EACH ROW 
BEGIN 
    INSERT INTO tg_log(message) VALUES('tg_a START'); 
    INSERT INTO b VALUES (NEW.id); 
    INSERT INTO tg_log(message) VALUES('tg_a INSERT INTO b'); 
    UPDATE b SET id = id + 1 WHERE id = NEW.id; 
    INSERT INTO tg_log(message) VALUES('tg_a UPDATE b'); 
    INSERT INTO tg_log(message) VALUES('tg_a END'); 
END$$ 
DELIMITER ; 

DROP TRIGGER IF EXISTS tg_b; 
DELIMITER $$ 
CREATE TRIGGER tg_b 
AFTER INSERT ON b 
FOR EACH ROW 
BEGIN 
    INSERT INTO tg_log(message) VALUES('tg_b START'); 
    INSERT INTO c VALUES (NEW.id); 
    INSERT INTO tg_log(message) VALUES('tg_b INSERT INTO c'); 
    INSERT INTO tg_log(message) VALUES('tg_b END'); 
END$$ 
DELIMITER ; 

Затем вставить строку в столе

INSERT INTO a VALUES(1); 

И вот что мы видим в из журнала

+----+---------------------+--------------------+ 
| id | dt     | message   | 
+----+---------------------+--------------------+ 
| 1 | 2013-07-27 23:31:42 | tg_a START   | 
| 2 | 2013-07-27 23:31:42 | tg_b START   | 
| 3 | 2013-07-27 23:31:42 | tg_b INSERT INTO c | 
| 4 | 2013-07-27 23:31:42 | tg_b END   | 
| 5 | 2013-07-27 23:31:42 | tg_a INSERT INTO b | 
| 6 | 2013-07-27 23:31:42 | tg_a UPDATE b  | 
| 7 | 2013-07-27 23:31:42 | tg_a END   | 
+----+---------------------+--------------------+ 
7 rows in set (0.00 sec) 

Вот SQLFiddle демо

+0

Хорошо, что прикованные триггеры можно рассматривать как вложенные вызовы функций - спасли мне беспорядок, и я кое-что узнал о журналах транзакций. –