81 DBMS_HIERARCHY
DBMS_HIERARCHY
には、階層およびアナリティック・ビューで使用される表内のデータを検証するためのサブプログラムが含まれています。
この章のトピックは、次のとおりです:
81.1 DBMS_HIERARCHYの概要
DBMS_HIERARCHY
パッケージには、データベース表の内容がアナリティック・ビューまたは階層での使用に適しているか検証するファンクション、検証の成功を確認するファンクション、および検証操作のロギング用の表を作成するプロシージャが含まれています。
ノート:
DBMS_HIERARCHY
サブプログラムのパラメータで指定する名前の大/小文字は区別されます。
アナリティック・ビューの使用方法の詳細は、『Oracle Databaseデータ・ウェアハウス・ガイド』を参照してください。
81.2 DBMS_HIERARCHYのセキュリティ・モデル
アナリティック・ビュー・オブジェクトおよび階層オブジェクトの検証に関するセキュリティ上の考慮事項を要約します。
ノート:
検証操作をロギングするために十分な表領域をユーザーが持っているか確認するには、次のいずれかを実行します。-
GRANT
UNLIMITED
TABLESPACE
TO
username;
-
ALTER
USERNAME
usernameQUOTA
sizeON
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
権限
81.3 DBMS_HIERARCHYサブプログラムの要約
この表は、DBMS_HIERARCHY
サブプログラムを示し、簡単に説明しています。
サブプログラム | 説明 |
---|---|
|
|
VALIDATE_ANALYTIC_VIEWファンクション |
表のデータがアナリティック・ビューでの使用に適しているか検証します。 |
VALIDATE_CHECK_SUCCESSファンクション |
先行する |
表のデータが階層での使用に適しているか検証します。 |
81.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_name がNULL の場合、表は現在のユーザーのスキーマ内に作成されます。
|
IGNORE_IF_EXISTS |
同じ名前の表が存在する場合に表を作成するかどうかを示すブール値。表を指定する場合、その表の構造は、このプロシージャにより作成される表の構造と同じである必要があります。 |
例
例81-1 検証ログ表の作成
BEGIN
DBMS_HIERARCHY.CREATE_VALIDATE_LOG_TABLE (
'VAL_AV_HIERARCHY_LOG',
'AV_USER',
FALSE
);
END;
/
81.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
でないかのどちらかである必要があります。これにより、代替レベル・キーがレベル・キーに基づいて決定されることが確認されます。 -
レベルの同じ代替キー列値を持つ行の各グループでは、キー列値の列値が同じである必要があります。これにより、レベル・キーが代替レベル・キー(代替キーには必須)に基づいて決定されることが確認されます。
例
例81-2 アナリティック・ビューの検証
DECLARE
log_num NUMBER;
obj_name VARCHAR2(8) := 'SALES_AV';
BEGIN
log_num := DBMS_HIERARCHY.VALIDATE_ANALYTIC_VIEW(obj_name);
END;
/
81.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)。
例
例81-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;
/
81.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
でないかのどちらかである必要があります。これにより、代替レベル・キーがレベル・キーに基づいて決定されることが確認されます。 -
レベルの同じ代替キー列値を持つ行の各グループでは、キー列値の列値が同じである必要があります。これにより、レベル・キーが代替レベル・キー(代替キーには必須)に基づいて決定されることが確認されます。
例
例81-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
例81-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