ディレクトリによってシャードされた表の作成
CREATE SHARDED TABLE文でPARTITION BY DIRECTORYを使用して、ディレクトリベースのシャード表を作成します。
たとえば:
CREATE SHARDED TABLE customers
( id NUMBER NOT NULL
, name VARCHAR2(30)
, address VARCHAR2(30)
, status VARCHAR2(1)
,
CONSTRAINT cust_pk PRIMARY KEY(id)
)
PARTITION BY DIRECTORY (id)
( PARTITION p1 TABLESPACE tbs1,
PARTITION p2 TABLESPACE tbs2,
PARTITION p3 TABLESPACE tbs3…)
DIRECTORY TABLESPACE tablespace-name //This clause is valid only for root table creation
;
ノート:
-
DIRECTORY TABLESPACE句は、パーティション定義の後にのみ使用でき、ディレクトリベースのシャード表のルート表の作成にのみ有効です。この句を使用すると、デフォルトの表領域を使用せずに、ディレクトリ表専用の表領域を別に作成できます。
-
ルート表に作成されたビュー名に追加された追加文字を考慮するため、ルート表名の最大長(識別子の長さ制限)は113です(
root_table_name_$SHARD_DIR_VIEWを参照)。 -
ディレクトリ表は、ルート表の作成時に自動的に作成されます。ディレクトリ表の定義は次のとおりです。
<shard user schema>.<root_table>$SDIR -
ユーザー定義のデータ分散とは異なり、
CREATE TABLE文のパーティションにキー値は指定されません。 -
ルート表とは異なるスキーマで親句を使用して子表を作成する場合は、子表のスキーマ所有者に追加権限が必要です。(これはディレクトリベースのデータ分散専用であり、通常のユーザー定義のデータ分散には必要ありません。)
これは、ディレクトリ表のシャーディング・キー列に対して子表に外部キー制約が存在し、ディレクトリ・マッピングにシャーディング・キー値が存在せずに子表に行を挿入できないようにするためです。その結果、子表のスキーマには、ディレクトリ表のシャーディング・キー列に対する参照権限が必要です。
後述の「参照の付与」を参照してください。
参照の付与
この例を次の図に示します。
-
ルート表
dealershipsはスキーマuser1の下にあり、シャーディング・キーとしてaccount_idがあります。 -
子表
salespeopleはスキーマuser2の下にあり、「parent user1.dealerships」で定義されます。
このsalespeople子表を作成する前に、次のものが必要です。
-
grant all privileges on user1.dealerships to user2;これは、ユーザー定義のデータ分散に必要なものと同じです。
-
grant references (account_id) on user1.dealerships$sdir to user2;これは、ディレクトリベースのデータ分散には新しいものです。
dealerships$sdirは内部で生成されたディレクトリ表名であり、root_table_name$sdirの形式であることに注意してください。
2番目の付与がない場合、子表作成DDLはシャード・カタログで成功しますが、シャードで失敗します(外部キーはシャードにのみ追加されるため)。