修飾されていないテーブルの名前が検出されると、以下のすべてのデータベースでその名前のテーブルが検索されます。
- デフォルト データベース
- SQLリクエストで参照されているすべてのデータベース
- ログオン ユーザー データベースの中のその名前の揮発テーブル
検索処理では、これらのデータベースの任意の1つだけでそのテーブル名を検出する必要があります。複数のデータベースでそのテーブル名が検出された場合は、データベースからテーブル名が曖昧であることを示すエラー メッセージが返されます。
以下の例では、修飾されていないテーブルの名前を揮発テーブルで使用することの結果を示しています。
- 修飾されていない名前のテーブルがログオン ユーザー データベース内の揮発テーブルであって、他のデータベースにその名前のテーブルがない場合は、デフォルトでログオン ユーザー データベース内の揮発テーブルが参照されます。
.LOGON u1 CREATE VOLATILE TABLE volatile_table_1 ( f1 INTEGER, f2 INTEGER) ON COMMIT PRESERVE ROWS; DATABASE db1; INSERT volatile_table_1 (1,1);
ここでは、参照はu1.vt1 ユーザー データベースの揮発テーブルu1.vt1に対して行なわれ、現行のデフォルト データベースdb1を参照するわけではありません。
- 修飾されていない名前のテーブルがログオン ユーザー データベース内の揮発テーブルで、別のデータベースにもその名前のテーブルがある場合、次のような曖昧なテーブル名エラーが生じます。
.LOGON u1 CREATE VOLATILE TABLE volatile_table_1 ( f1 INTEGER, f2 INTEGER) ON COMMIT PRESERVE ROWS; DATABASE db1; CREATE TABLE volatile_table_1 ( g1 INTEGER, g2 INTEGER); INSERT INTO volatile_table_1 VALUES (1,1);
INSERT操作はエラー メッセージをリクエスト側に返します。volatile_table_1という名前のテーブルはログオン ユーザー データベースu1に既に存在しているからです。
- 修飾されていないテーブル名が、ログオン ユーザー データベースの揮発テーブルと永久テーブルに一致した場合、揮発テーブルがデフォルトで参照されます。
このような状況は、ユーザーがセッション1で揮発テーブルを作成し、セッション2でそのユーザー データベースの中に同じ名前の永久テーブルを作成したような場合に発生します。セッション1で修飾しないでその名前を参照した場合は、デフォルトで揮発テーブルの方が参照されます。セッション2からは、セッション1の揮発テーブルが見えません。したがって、セッション2で修飾しないでその名前を参照した場合は、デフォルトで永久テーブルが参照されます。