型付き表の作成

型付き表は、CREATE TYPE ステートメントを使用して特性が定義されているオブジェクトのインスタンスを実際に保管するのに使用されます。 変形した CREATE TABLE ステートメントを使用して、型付き表を作成することができます。 構造化タイプの階層を基にした型付き表の階層を作成することもできます。

このタスクについて

サブタイプのインスタンスを型付き表に保管するには、 対応する表階層を作成する必要があります。

以下の図は、型付き表の階層を示しています。 図の後に続く例は、この階層の作成を示しています。

図1: 型付き表の階層
型付き表階層。

BusinessUnit 型付き表を作成するための SQL を以下に示します。

   CREATE TABLE BusinessUnit OF BusinessUnit_t
      (REF IS Oid USER GENERATED);

Person 表階層に表を作成するための SQL を以下に示します。

   CREATE TABLE Person OF Person_t
      (REF IS Oid USER GENERATED);

   CREATE TABLE Employee OF Employee_t UNDER Person
      INHERIT SELECT PRIVILEGES
      (SerialNum WITH OPTIONS NOT NULL,
      Dept WITH OPTIONS SCOPE BusinessUnit );

   CREATE TABLE Student OF Student_t UNDER Person
      INHERIT SELECT PRIVILEGES;

   CREATE TABLE Manager OF Manager_t UNDER Employee
      INHERIT SELECT PRIVILEGES;

   CREATE TABLE Architect OF Architect_t UNDER Employee
      INHERIT SELECT PRIVILEGES;

表のタイプの定義

前述の例で最初に作成される型付き表は、BusinessUnit です。 この表は OF タイプ BusinessUnit_t として定義されているため、そのタイプのインスタンスを保持することになります。 つまり、この表は、構造化タイプ BusinessUnit_tの各属性に対応する列と、オブジェクト ID 列 という追加の列を持つことになります。

オブジェクト ID の命名

型付き表には他のオブジェクトが参照できるオブジェクトが入っているので、 すべての型付き表の最初の列はオブジェクト ID 列になっています。 この例では、オブジェクト ID 列のタイプは REF (BusinessUnit_t) です。REF IS ... USER GENERATED 節を使用して、オブジェクト ID 列に名前を付けることが できます。 この例では、列に Oid という名前が付けられています。 REF IS 節の USER GENERATED 部分は、 新たに挿入されるすべての行のオブジェクト ID 列の初期値を与える必要があることを示しています。 オブジェクト指向の設計では、 データとオブジェクト ID を完全に分離することが一般的です。 そのため、オブジェクト ID の挿入後は、オブジェクト ID の値を更新することはできません。 Db2® で OID 値を生成する場合は、SEQUENCE 関数または GENERATE_UNIQUE () 関数を使用できます。

表階層での位置の指定

Person 型付き表のタイプは Person_tです。 従業員および学生のサブタイプのインスタンスを保管するには、Person 表の副表 Employee および Student を作成する必要があります。 Employee_t の 2 つの追加のサブタイプにも表が必要です。 これらの副表の名前は、Manager および Architect になります。 サブタイプがスーパータイプの属性を継承するのと同様に、 副表もオブジェクト ID 列を含めたスーパー表の列を継承します。

注: 副表は、そのスーパー表と同じスキーマ内になければなりません。

したがって、Employee 副表の行には、合計 7 つの列 (OidNameAgeAddressSerialNumSalary、および Dept) があることになります。

スーパー表に対して作用する SELECT、UPDATE、または DELETE ステートメントは、 デフォルトではすべての副表に対しても自動的に作用します。 例えば、Employee 表に対する UPDATE ステートメントは Employee表、Manager表、および Architect 表の行に影響を与える可能性がありますが、Manager 表に対する UPDATE ステートメントは Manager 行にのみ影響を与えます。

SELECT、INSERT、または DELETE ステートメントのアクションを特定の表に制限する場合は、 ONLY オプションを使用します。

SELECT 特権は継承されたものであることの表示

CREATE TABLE ステートメントの必須 INHERIT SELECT PRIVILEGES 節は、UNDER 節で作成された結果の副表 (Employeeなど) に、スーパー表 (結果の副表の作成元) と同じユーザーおよびグループ ( Personなど) が、最初はアクセスできることを指定します。 スーパー表に対して現在 SELECT 特権を保留しているユーザーまたはグループには、 新しく作成された副表に対する SELECT 特権も付与されます。 副表の作成者が、SELECT 特権の付与者になります。 副表に対する DELETE や UPDATE などの特権を指定するには、 正規表に対する特権を指定するのに使用するのと同じ明示的 GRANT または REVOKE ステートメントを発行する必要があります。

特権は、表階層のすべてのレベルで別々に付与したり取り消したりすることができます。 副表を作成する場合は、その副表に対する継承された SELECT 特権を取り消すこともできます。 継承された SELECT 特権を副表から取り消すと、 スーパー表に対する SELECT 特権を持つユーザーが、副表だけに定義されている列を見ることを防ぐことができます。 継承された SELECT 特権を副表から取り消すと、 スーパー表に対する SELECT 特権しか持っていないユーザーは、 副表の行のスーパー表の列だけを見ることができます。 副表に対する必要な特権を保留しているユーザーが直接操作できるのは、副表だけです。 したがって、ユーザーが副表の管理者の賞与を選択できないようにするには、 その副表に対する SELECT 特権を取り消して、 この情報が必要なユーザーだけに SELECT 特権を付与するようにします。

列オプションの定義

WITH OPTIONS 節を使用すると、 型付き表の中の個々の列に適用されるオプションを定義することができます。 WITH OPTIONS の形式は次のとおりです。

   column-name WITH OPTIONS column-options

column-name は CREATE TABLE または ALTER TABLE ステートメントの中の列の名前を表し、 column-options は列に定義されているオプションを表しています。

例えば、ユーザーが SerialNum 列に NULL を挿入できないようにするには、次のように NOT NULL 列オプションを指定します。

   (SerialNum WITH OPTIONS NOT NULL)

参照列の有効範囲の定義

WITH OPTIONS の別の使用法は、列の有効範囲を指定するという方法です。 例えば、Employee表とその副表の中では、

   Dept WITH OPTIONS SCOPE BusinessUnit

という節は、この表とその副表の Dept 列の 有効範囲BusinessUnit であることを宣言します。 つまり、Employee 表のこの列の中の参照値は、BusinessUnit 表の中のオブジェクトを参照することが意図されています。

例えば、 Employee 表に対する以下の照会では、間接参照演算子を使用して、 Dept 列から BusinessUnit 表へのパスをたどるように Db2 に指示します。 参照解除演算子は、Name 列の値を返します。

   SELECT Name, Salary, Dept->Name
      FROM Employee;