77 DBMS_HIERARCHY

DBMS_HIERARCHYには、階層およびアナリティック・ビューで使用される表内のデータを検証するためのサブプログラムが含まれています。

77.1 DBMS_HIERARCHYの概要

DBMS_HIERARCHYパッケージには、データベース表の内容がアナリティック・ビューまたは階層での使用に適しているか検証するファンクション、検証の成功を確認するファンクション、および検証操作のロギング用の表を作成するプロシージャが含まれています。

ノート:

DBMS_HIERARCHYサブプログラムのパラメータで指定する名前の大/小文字は区別されます。

アナリティック・ビューの使用方法の詳細は、『Oracle Databaseデータ・ウェアハウス・ガイド』を参照してください。

77.2 DBMS_HIERARCHYのセキュリティ・モデル

アナリティック・ビュー・オブジェクトおよび階層オブジェクトの検証に関するセキュリティ上の考慮事項を要約します。

このパッケージ内のすべてのプロシージャは、現在のユーザーが指定されたオブジェクトに対する必要な権限を持っているか検証し、それらの権限が見つからない場合はエラーを戻します。

ノート:

検証操作をロギングするために十分な表領域をユーザーが持っているか確認するには、次のいずれかを実行します。
  • GRANT UNLIMITED TABLESPACE TO username;

  • ALTER USERNAME username QUOTA size ON tablespace_name;

このパッケージを使用するには、次のシステム権限が必要です。

ユーザー自身のスキーマ内のオブジェクトを検証するには:

  • CREATE_VALIDATE_LOG_TABLE、あるいはVALIDATE_ANALTYIC_VIEWまたはVALIDATE_HIERARCHYで自動的に表を作成するためのCREATE TABLE権限

  • アナリティック・ビューや階層で使用される表またはビューに対するSELECT権限

  • 階層の属性ディメンションにより使用される表、またはアナリティック・ビューにより使用されるファクト表に対するINSERT権限

異なるスキーマ内のオブジェクトを検証するには:

  • CREATE_VALIDATE_LOG_TABLE、あるいはVALIDATE_ANALTYIC_VIEWまたはVALIDATE_HIERARCHYで自動的に表を作成するためのCREATE ANY TABLE権限

  • 階層の属性ディメンションにより使用される表、またはアナリティック・ビューにより使用されるファクト表に対するINSERT ANY TABLE権限

77.3 DBMS_HIERARCHYサブプログラムの要約

この表は、DBMS_HIERARCHYサブプログラムを示し、簡単に説明しています。

サブプログラム 説明

CREATE_VALIDATE_LOG_TABLEプロシージャ

VALIDATE_HIERARCHYおよびVALIDATE_ANALYTIC_VIEWファンクションにより生成されたメッセージのロギングに使用できる表を作成します。

VALIDATE_ANALYTIC_VIEWファンクション

表のデータがアナリティック・ビューでの使用に適しているか検証します。

VALIDATE_CHECK_SUCCESSファンクション

先行するVALIDATE_HIERARCHYまたはVALIDATE_ANALYTIC_VIEWのコールが成功したか、あるいは検証エラーが生成されたかを示します。

VALIDATE_HIERARCHYファンクション

表のデータが階層での使用に適しているか検証します。

77.3.1 CREATE_VALIDATE_LOG_TABLEプロシージャ

このプロシージャは、アナリティック・ビューまたは階層で使用されるデータを検証するVALIDATE_ANALYTIC_VIEWまたはVALIDATE_HIERARCHYファンクションにより生成されたメッセージのロギングに使用できる表を作成します。

このプロシージャにより作成される表の構造は、次のとおりです。

NAME               NULL?    DATATYPE
------------------ -------- --------
LOG_NUMBER         NOT NULL NUMBER
ACTION_ORDER       NOT NULL NUMBER
OBJECT_OWNER       NOT NULL VARCHAR2(128 BYTE)
OBJECT_NAME        NOT NULL VARCHAR2(128 BYTE)
ACTION             NOT NULL VARCHAR2(10 BYTE)
TIME               NOT NULL TIMESTAMP(6)
ERROR_NUMBER                NUMBER
ERROR_MESSAGE               VARCHAR2(4000)

構文

DBMS_HIERARCHY.CREATE_VALIDATE_LOG_TABLE (
    table_name        IN  VARCHAR2,
    owner_name        IN  VARCHAR2         DEFAULT NULL
    IGNORE_IF_EXISTS  IN  PL/SQL BOOLEAN   DEFAULT FALSE);

パラメータ

パラメータ 説明
table_name 作成する表の名前。
owner_name 表の作成先のスキーマの名前。owner_nameNULLの場合、表は現在のユーザーのスキーマ内に作成されます。
IGNORE_IF_EXISTS 同じ名前の表が存在する場合に表を作成するかどうかを示すブール値。表を指定する場合、その表の構造は、このプロシージャにより作成される表の構造と同じである必要があります。

例77-1 検証ログ表の作成

BEGIN
  DBMS_HIERARCHY.CREATE_VALIDATE_LOG_TABLE (
    'VAL_AV_HIERARCHY_LOG',
    'AV_USER',
    FALSE
  );
END;
/ 

77.3.2 VALIDATE_ANALYTIC_VIEWファンクション

このファンクションは、表またはビューのデータがアナリティック・ビューの定義に固有の論理制約に準拠しているか検証します。

構文

DBMS_HIERARCHY.VALIDATE_ANALYTIC_VIEW (
      analytic_view_name         IN VARCHAR2   DEFAULT NULL,
      analytic_view_owner_name   IN VARCHAR2   DEFAULT NULL,
      log_table_name             IN VARCHAR2   DEFAULT NULL,
      log_table_owner_name       IN VARCHAR2   DEFAULT NULL)
      RETURN NUMBER;

パラメータ

パラメータ 説明
analytic_view_name 検証するアナリティック・ビューの名前。
analytic_view_owner_name アナリティック・ビューが含まれているスキーマの所有者の名前。
log_table_name 検証操作の結果を格納する検証ログ表の名前。
log_table_owner_name 検証ログ表が存在するスキーマ、または表の作成先のスキーマの所有者の名前。

戻り値

検証結果用の検証ログ表のエントリの数。

使用上のノート

log_table_nameパラメータがNULLの場合、VALIDATE_ANALYTIC_VIEWファンクションは検証ログ表を作成します。作成される表の名前は、DBMS_HIERARCHY_LOGです。

検証操作が開始されると、STARTアクションの行がログ表に挿入されます。検証操作が完了すると、ENDアクションの行がログ表に挿入されます。エラーが検出されると、ERRORアクションの行がログ表に挿入され、関連付けられたerror_number列とerror_message列が入力されます。検証ログ表に挿入されたすべての行には、ログ番号と挿入時刻が含まれています。

VALIDATE_ANALYTIC_VIEWファンクションは、アナリティック・ビューのディメンション化に使用される各属性ディメンションについて次の条件が満たされていることを確認します。

  • 属性ディメンションのファクト表に見つかったキー値は、その属性ディメンションのスター・スキーマ・ディメンション表に存在している必要があります。

  • 属性ディメンションの参照される属性値は、そのディメンションのスター・スキーマ・ディメンション表のすべての行にわたって一意である必要があります。

また、このファンクションは、アナリティック・ビューの各階層について次の条件が満たされていることを確認します。

  • レベルの主キーは、レベルの属性ごとに一意の値を決定します。

  • 階層の属性ディメンションで使用される表またはビューの各行では、NOT NULLレベルの各レベル・キー列(代替キーを含む)の値はNULLでない値です。

  • 表またはビューの各行では、すべてのレベル・キー列およびSKIP WHEN NULLレベルの代替キー列がNULLであるか、いずれの列もNULLでないかのどちらかである必要があります。これにより、代替レベル・キーがレベル・キーに基づいて決定されることが確認されます。

  • レベルの同じ代替キー列値を持つ行の各グループでは、キー列値の列値が同じである必要があります。これにより、レベル・キーが代替レベル・キー(代替キーには必須)に基づいて決定されることが確認されます。

例77-2 アナリティック・ビューの検証

DECLARE
  log_num NUMBER;
  obj_name VARCHAR2(8) := 'SALES_AV';
BEGIN
   log_num := DBMS_HIERARCHY.VALIDATE_ANALYTIC_VIEW(obj_name);
END;
/

77.3.3 VALIDATE_CHECK_SUCCESSファンクション

このファンクションは、先行するVALIDATE_HIERARCHYまたはVALIDATE_ANALYTIC_VIEWのコールが成功したか、あるいは検証エラーが生成されたかを示します。

構文

DBMS_HIERARCHY.VALIDATE_CHECK_SUCCESS (
    TOPOBJ_NAME           IN  VARCHAR2,
    TOPOBJ_OWNER          IN  VARCHAR2,
    LOG_NUMBER            IN  VARCHAR2
    LOG_TABLE_NAME        IN  VARCHAR2
    LOG_TABLE_OWNER_NAME  IN  VARCHAR2 )
    RETURN VARCHAR2;

パラメータ

パラメータ 説明
TOPOBJ_NAME 階層またはアナリティック・ビューの名前。
TOPOBJ_OWNDER 階層またはアナリティック・ビューの所有者。
LOG_NUMBER ログ・エントリの番号。
LOG_TABLE_NAME ログ表の名前。
LOG_TABLE_OWNER_NAME 表が存在するスキーマの名前。

戻り値

VARCHAR2 (エラーが発生していない場合はSUCCESS、エラーが発生した場合はERROR)。

例77-3 VALIDATE_CHECK_SUCCESSの使用方法

次の例では、先行するVALIDATE_ANALTYIC_VIEWのコールでエラーが発生したかどうかを調べます。

DECLARE
  log_num NUMBER;
  succ VARCHAR2(7);
  obj_name VARCHAR2(8) := 'SALES_AV';
BEGIN
   log_num := dbms_hierarchy.validate_analytic_view(obj_name);
   succ := dbms_hierarchy.validate_check_success(
      topobj_name => obj_name, log_number => log_num);
  IF (succ != 'SUCCESS') THEN
     RAISE_APPLICATION_ERROR(
       num => -20000,
       msg => 'Validate failed!');
  END IF;
END;
/

77.3.4 VALIDATE_HIERARCHYファンクション

このファンクションは、表またはビューのデータが、表またはビューを使用する属性ディメンションやその属性ディメンションを使用する階層の定義に固有の論理制約に準拠しているか検証します。

構文

DBMS_HIERARCHY.VALIDATE_HIERARCHY (
      hier_name                IN VARCHAR2,
      hier_owner_name          IN VARCHAR2    DEFAULT NULL,
      log_table_name           IN VARCHAR2    DEFAULT NULL,
      log_table_owner_name     IN VARCHAR2    DEFAULT NULL)
      RETURN NUMBER;

パラメータ

パラメータ 説明
hier_name 検証する階層の名前。
hier_owner_name 階層が含まれているスキーマの所有者の名前。
log_table_name 検証操作の結果を格納する検証ログ表の名前。
log_table_owner_name 検証ログ表が存在するスキーマ、または表の作成先のスキーマの所有者の名前。

戻り値

検証結果用の検証ログ表のエントリの数。

使用上のノート

log_table_nameパラメータがNULLの場合、VALIDATE_HIERARCHYファンクションは検証ログ表を作成します。作成される表の名前は、DBMS_HIERARCHY_LOGです。

検証操作が開始されると、STARTアクションの行がログ表に挿入されます。検証操作が完了すると、ENDアクションの行がログ表に挿入されます。エラーが検出されると、ERRORアクションの行がログ表に挿入され、関連付けられたerror_number列とerror_message列が入力されます。検証ログ表に挿入されたすべての行には、ログ番号と挿入時刻が含まれています。

VALIDATE_HIERARCHYファンクションは、階層について次の条件が満たされていることを確認します。

  • レベルの主キーは、レベルの属性ごとに一意の値を決定します。

  • 階層の属性ディメンションで使用される表またはビューの各行では、NOT NULLレベルの各レベル・キー列(代替キーを含む)の値はNULLでない値です。

  • 表またはビューの各行では、すべてのレベル・キー列およびSKIP WHEN NULLレベルの代替キー列がNULLであるか、いずれの列もNULLでないかのどちらかである必要があります。これにより、代替レベル・キーがレベル・キーに基づいて決定されることが確認されます。

  • レベルの同じ代替キー列値を持つ行の各グループでは、キー列値の列値が同じである必要があります。これにより、レベル・キーが代替レベル・キー(代替キーには必須)に基づいて決定されることが確認されます。

例77-4 階層の検証および表名の指定

次の例では、PRODUCT_HIER階層を検証し、結果をVAL_AV_HIERARCHY_LOGという名前の表に挿入することを指定します。階層の所有者、および表が含まれているスキーマの所有者は、AV_USERです。

-- Create a log table.
BEGIN
  DBMS_HIERARCHY.CREATE_VALIDATE_LOG_TABLE (
    'VAL_AV_HIERARCHY_LOG',
    'AV_USER',
    FALSE
  );
END;
/   
-- Validate the hierarchy.
DECLARE
  log_num NUMBER;
  obj_name VARCHAR2(12) := 'PRODUCT_HIER';
  table_name  VARCHAR2(28) := 'VAL_AV_HIERARCHY_LOG';
BEGIN
   log_num := DBMS_HIERARCHY.VALIDATE_HIERARCHY(obj_name, 'AV_USER', table_name);
END;
/

ログ表を問い合せます。

SELECT LOG_NUMBER, ACTION, OBJECT_NAME, ERROR_NUMBER, ERROR_MESSAGE
  FROM AV_USER.VAL_AV_HIERARCHY_LOG;
  WHERE OBJECT_NAME = 'PRODUCT_HIER';

LOG_NUMBER ACTION     OBJECT_NAME         ERROR_NUMBER ERROR_MESSAGE
---------- ---------- ------------------- ------------ -------------
         1 START      PRODUCT_HIER 
         1 END        PRODUCT_HIER

例77-5 表名を指定しない階層の検証

次の例は、検証ログ表を指定しない場合に、VALIDATE_HIERARCHYファンクションによってDBMS_HIERARCHY_LOGという名前の表が作成されることを示しています。

DECLARE
  log_num NUMBER;
  obj_name VARCHAR2(12) := 'PRODUCT_HIER';
BEGIN
   log_num := DBMS_HIERARCHY.VALIDATE_HIERARCHY(obj_name);
END;

ログ表を問い合せます。

SELECT LOG_NUMBER, ACTION, OBJECT_NAME, ERROR_NUMBER, ERROR_MESSAGE
  FROM DBMS_HIERARCHY_LOG
  WHERE OBJECT_NAME = 'PRODUCT_HIER';

LOG_NUMBER ACTION     OBJECT_NAME         ERROR_NUMBER ERROR_MESSAGE
---------- ---------- ------------------- ------------ -------------
         1 START      PRODUCT_HIER 
         1 END        PRODUCT_HIER