2008.09.05 Friday
徹底比較!! PostgreSQL vs MySQLパート2 with 勝手に vs Firebird (14)
前回の記述のうち、Oracle部分について調査してくれた方がいらっしゃったので、同じことをFirebirdで確認してみます。
環境はチト仕事で使っているFirebird 1.5.5です。(1.5.xの最新版)
では実験開始。参照先と同様に、INSERTしたらトリガが起動されて、そのトリガのなかでINSERTを行って、その中でもトリガが起動されて....という無限連鎖を作成します。
実際に無限連鎖トリガーを定義してみます。
そして実行。
Firebird(InterBaseもそう)では、Oracleのように一行ずつ実行してエラーというよりは、無限連鎖っぽいもの、つまり一回のリクエストで多くの同時実行が行われたときに上限にひっかかるみたいです。で、その上限はいくらかとおもい、Generatorを確認してみると、750のようですね。
このエラーは、今回のような意地悪な実験のため、というよりも、トリガー初心者がついやってしまう、以下のような記述を実行時に避ける物、のようです。
Too Many Concurrent Executions of the Same Request
環境はチト仕事で使っているFirebird 1.5.5です。(1.5.xの最新版)
では実験開始。参照先と同様に、INSERTしたらトリガが起動されて、そのトリガのなかでINSERTを行って、その中でもトリガが起動されて....という無限連鎖を作成します。
create table master(seqnum int); -- 対象の表
create generator master_seq; -- 連番の作成
select gen_id(master_seq, 0) from rdb$database; -- 値の確認
GEN_ID
=====================
0
実際に無限連鎖トリガーを定義してみます。
SET TERM !! ;
CREATE TRIGGER INS_MASTRE_TEST FOR MASTER
BEFORE INSERT POSITION 0
AS BEGIN
INSERT INTO MASTER VALUES(GEN_ID(MASTER_SEQ, 1));
END
!!
SET TERM ; !!
そして実行。
SQL> insert into master values(-100);
Statement failed, SQLCODE = -693
Too many concurrent executions of the same request
Firebird(InterBaseもそう)では、Oracleのように一行ずつ実行してエラーというよりは、無限連鎖っぽいもの、つまり一回のリクエストで多くの同時実行が行われたときに上限にひっかかるみたいです。で、その上限はいくらかとおもい、Generatorを確認してみると、750のようですね。
SQL> select gen_id(master_seq, 0) from rdb$database;
GEN_ID
=====================
751
このエラーは、今回のような意地悪な実験のため、というよりも、トリガー初心者がついやってしまう、以下のような記述を実行時に避ける物、のようです。
Too Many Concurrent Executions of the Same Request