CREATE MACROリクエストを実行すると、システムはマクロで指定されたテキストリクエストを構文解析し、それらのリクエストで完全修飾されていない名前を解釈します。マクロのDDLリクエストの修飾されていない名前は解釈されません。
次の例を考えてみます。ユーザーxyzのデフォルトのデータベースはabcであり、ユーザーlmnのデフォルトのデータベースはdefです。ユーザーxyzは、macro_1を次のように定義します。
CREATE MACRO macro_1 AS ( CREATE TABLE mambo ( column_1 INTEGER, column_2 INTEGER); );
このCREATE TABLEリクエストには、完全修飾テーブル名が指定されていません。
CREATE TABLEはDDL文であるため、それを含むデータベースの名前はマクロの作成時には解釈されません。その名前が解釈されるのは、後にマクロが実行されるときとなります。その結果、マクロは実行時に常に正しいストレージ階層を調べることになります。
以下の表は、この仕組みを示しています。
macro_1という名前のマクロを実行するユーザー | mamboという名前のテーブルが作成されるデータベース |
---|---|
xyz | abc |
lmn | def |
ユーザーxyzが次のようにmacro_2という名前のマクロを作成するとします。
CREATE MACRO macro_2 AS ( UPDATE tango SET counter = counter + 1;);
UPDATEリクエストには、完全修飾テーブル名は指定されてない。
UPDATE文はDML文なので、macro_2の作成時に完全に処理されます。続いてmacro_2を実行すると、実行したユーザーがabc.tango、abc、または他のどのユーザーであっても、lmnが更新されます。
まとめると、マクロ内で修飾されていない名前を指定する場合、次のルールが適用されます。
- マクロ定義の中で修飾されていない名前は、マクロの作成時にDDL文に解釈ない。マクロの実行時に初めて解釈されます。
- マクロ定義の中で修飾されていない名前は、マクロの作成時にDML文に完全に解釈される。