Dependenciesinternal tracking ofPrepared
statementstracking of dependencies は準備済み文の依存関係を追跡します。準備済み文とは実行前にコンパイルされたSQL文の事です。典型的なシナリオとして、これらは準備(プレコンパイル)された後、複数回実行されます。
準備済み文はディクショナリの情報や、それ自身から参照する他の文に依存します。(ディクショナリの情報とは、表・列・制約・索引・ビュー・トリガのことです。)
準備済み文が依存しているディクショナリの情報や文が、破棄されたり変更されたりすると、内部的に準備済み文は無効となり、は準備済み文が実行されるとき、自動的に再コンパイルを行おうとします。
もしこのとき、準備済み文の再コンパイルが失敗すると、実行は失敗します。
しかしながら、もし何らかの対応を行って(無くなった表を復活させるなどして)失われた依存性を元に戻せるのなら、失敗した準備済み文を成功裏に実行することができます。これは、が再実行が要求されたとき、再コンパイルを自動的に行うからです。
お互いに依存した文-UPDATE WHERE CURRENT文は参照する文に依存します。依存する文を破棄すると、UPDATE WHERE CURRENT文は無効になります。
さらに準備済み文の結果がオープンしている場合、ある種のDDL文の実行を妨げます。
それぞれの文に対応したマニュアルの頁には、その文が準備された場合、どのようなことをすると無効になるのかが書かれています。
ここにのijというツールを使って例を示します。 ij> CREATE TABLE mytable (mycol INT);
0 rows inserted/updated/deleted
ij> INSERT INTO mytable VALUES (1), (2), (3);
3 rows inserted/updated/deleted
-- この例ではijのprepareコマンドを使います。
-- このコマンドにより文が準備されます。
ij> prepare p1 AS 'INSERT INTO MyTable VALUES (4)';
-- p1はmytableに依存します;
ij> execute p1;
1 row inserted/updated/deleted
-- は再コンパイルせずに文を実行します。
ij> CREATE INDEX i1 ON mytable(mycol);
0 rows inserted/updated/deleted
-- 新しい索引のため、p1は一時的に無効となります。
ij> execute p1;
1 row inserted/updated/deleted
-- は自動的にp1を再コンパイルして、実行します。
ij> DROP TABLE mytable;
0 rows inserted/updated/deleted
-- では以下のように表を破棄することができます。
-- これはp1の結果が閉じているからです。
-- しかしながらp1は一時的に無効となります。
ij> CREATE TABLE mytable (mycol INT);
0 rows inserted/updated/deleted
ij> INSERT INTO mytable VALUES (1), (2), (3);
3 rows inserted/updated/deleted
ij> execute p1;
1 row inserted/updated/deleted
-- p1は無効となっているので、は実行の前に再コンパイルを行います。
-- 再コンパイルは成功して、文は実行できます。
ij> DROP TABLE mytable;
0 rows inserted/updated/deleted
-- p1は無効です。
-- 今度は最コンパイルしようとしても失敗するので、
-- 実行も失敗です。
ij> execute p1;
ERROR 42X05: Table/View 'MYTABLE' does not exist.