ディレクトリによってシャードされた表の作成
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はシャード・カタログで成功しますが、シャードで失敗します(外部キーはシャードにのみ追加されるため)。