0

2 つのテーブル A と B があり、両方に挿入トリガーがあるとします。

テーブル A のトリガーが行を 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
4

1 に答える 1

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 ;

次に、テーブル a に行を挿入します

INSERT INTO a VALUES(1);

出力ログには次のように表示されます

+----+---------------------+--------------------+
| | ID | dt | メッセージ |
+----+---------------------+--------------------+
| | 1 | 2013-07-27 23:31:42 | tg_a 開始 |
| | 2 | 2013-07-27 23:31:42 | tg_b 開始 |
| | 3 | 2013-07-27 23:31:42 | tg_b c に挿入 |
| | 4 | 2013-07-27 23:31:42 | tg_b おわり |
| | 5 | 2013-07-27 23:31:42 | tg_a b に挿入 |
| | 6 | 2013-07-27 23:31:42 | tg_a 更新 b |
| | 7 | 2013-07-27 23:31:42 | tg_a 終了 |
+----+---------------------+--------------------+
7 行セット (0.00 秒)

これがSQLFiddleのデモです

于 2013-07-28T03:42:24.577 に答える