Hitachi

ノンストップデータベース HiRDB Version 9 コマンドリファレンス(Windows(R)用)


13.2.1 整合性チェック機能

整合性チェック機能は,参照制約又は検査制約の整合性をチェックし,制約に違反する行がない場合は検査保留状態を解除する機能です。

参照制約の整合性チェック

参照制約に基づいて,表の外部キーの値が,その表が参照する表の主キーと同じ値を持つかどうかをチェックします。チェックの結果,制約に違反する行がない場合は,検査保留状態を解除します。制約に違反する行がある場合は,検査保留状態を設定します。ただし,外部キー値にナル値を含む行はチェック対象としません。なお,参照制約の整合性チェックは,データベースの容量によっては時間が掛かることがあります。実行時間については,「参照制約の整合性チェック方法」のSQLから見積もってください。

検査制約の整合性チェック

検査制約の定義に基づいて,行の値が検査制約の範囲内であるかどうかをチェックします。チェックの結果,制約に違反する行がない場合は,検査保留状態を解除します。制約に違反する行がある場合は,検査保留状態を設定します。なお,検査制約の整合性チェックは,データベースの容量によっては時間が掛かることがあります。実行時間については,「検査制約の整合性チェック方法」のSQLから見積もってください。

〈この項の構成〉

(1) 整合性チェック機能の実行単位

整合性チェック機能は,次のどちらかの単位で実行します。

(a) 表単位

表に定義された参照制約及び検査制約のうち,検査保留状態となったすべての制約に対して,制約ごとに整合性チェックをします。表単位で整合性チェックをする場合は,-tオプションを指定します。

表単位の整合性チェックは,次の場合に適用します。

  • 表に定義された参照制約及び検査制約のうち,検査保留状態となったすべての制約について,1回のpdconstckで違反があるかどうかを検査し,検査保留状態を解除する場合。

  • pdmodでRDエリアを再初期化して,ディクショナリ表の検査保留状態が解除されなかった場合など,RDエリアの検査保留状態から,表の検査保留状態及び制約の検査保留状態を解除するとき(詳細については,「再初期化後の表,及びインデクスの状態」を参照してください)。

(b) 制約単位

検査保留状態に関係なく,一つの制約だけの整合性を検査します。制約単位で整合性を検査する場合は,-cオプションを指定します。

制約単位の整合性チェックは,次の場合に適用します。

  • 個々の制約について,違反があるかどうかをチェックする場合。

(2) 参照制約の整合性チェック

(a) 参照制約の整合性チェック方法

参照制約の整合性チェックでは,制約ごとに次のSQLで整合性をチェックします。

  • 参照制約の整合性チェックで実行されるSQL

    SELECT  DISTINCT "外部キー構成列1", "外部キー構成列2", …, "外部キー構成列n"
    FROM "参照表の所有者名"."参照表の表識別子" RIC_REF_TBL
    WHERE ("外部キー構成列1" IS NOT NULL AND
          "外部キー構成列2" IS NOT NULL AND … "外部キー構成列n" IS NOT NULL)
    AND NOT EXISTS (SELECT * FROM "被参照表の所有者名". "被参照表の表識別子" RIC_RFD_TBL
    WHERE (RIC_RFD_TBL."主キー構成列1", RIC_RFD_TBL."主キー構成列2",
            …, RIC_RFD_TBL."主キー構成列n") =
          (RIC_REF_TBL."外部キー構成列1", RIC_REF_TBL."外部キー構成列2",
            …, RIC_REF_TBL."外部キー構成列n")) 
    ORDER BY  "外部キー構成列1" ASC|DESC, "外部キー構成列2" ASC|DESC,
              …, "外部キー構成列n" ASC|DESC
    WITHOUT LOCK NOWAIT 

このSQLでは作業表を作成する場合があるため,シングルサーバ又はバックエンドサーバに,作業表を格納する作業表用ファイルが必要となります。作業表用ファイルの容量見積もりについては,マニュアル「HiRDB Version 9 システム導入・設計ガイド」を参照してください。

(b) 整合性有無の判断

(a)のSQLの実行結果(SQLCODE)と整合性の有無の関係を,次の表に示します。

表13‒5 SQLの実行結果と整合性の有無の関係(参照制約)

SQLCODE(検索行数)

整合性の有無

100(0件)

整合性あり

0(1件以上)

整合性なし

上記以外

実行エラー

(c) 制約違反となったキー値の出力

(a)のSQLを実行した結果,制約違反となったキー値を処理結果ファイルに出力します。なお,制約違反となったキー値は重複排除して出力します。キー値の出力形式については,「参照制約の整合性チェックの処理結果」を参照してください。

(d) 制約違反キー値の出力数上限値による整合性チェックの中断

制約違反となった行データ数が制約違反キー値の出力数上限値を超えた場合,該当する制約の整合性チェックを終了します。制約違反キー値の出力数上限値は,-wオプションで変更できます。

(3) 検査制約の整合性チェック

(a) 検査制約の整合性チェック方法

検査制約の整合性チェックでは,制約ごとに次のSQLで整合性をチェックします。

  • 検査制約の整合性チェックで実行されるSQL

    SELECT DISTINCT "検査制約の対象列1", "検査制約の対象列2", …, "検査制約の対象列n"
    FROM "検査制約を定義した表の所有者名"."検査制約を定義した表の表識別子"
    WHERE NOT(検査制約の探索条件) WITHOUT LOCK NOWAIT

このSQLでは作業表を作成する場合があるため,シングルサーバ又はバックエンドサーバに,作業表を格納する作業表用ファイルが必要となります。作業表用ファイルの容量見積もりについては,マニュアル「HiRDB Version 9 システム導入・設計ガイド」を参照してください。

注※

探索条件に指定した列定義がBLOB型又はBINARY型の場合,「DISTINCT」は指定しません。また,この場合は作業表を作成しません。

(b) 整合性有無の判断

(a)のSQLの実行結果(SQLCODE)と整合性の有無の関係を,次の表に示します。

表13‒6 SQLの実行結果と整合性の有無の関係(検査制約)

SQLCODE(検索行数)

整合性の有無

100(0件)

整合性あり

0(1件以上)

整合性なし

上記以外

実行エラー

(c) 制約違反となったキー値の出力

(a)のSQLを実行した結果,制約違反となったキー値を処理結果ファイルに出力します。なお,探索条件に指定した列のデータ型がBLOB型又はBINARY型を含まない場合,制約違反となったキー値は重複排除して出力します。BLOB型又はBINARY型を含む場合は,制約違反となったキー値の重複排除をしません。キー値の出力形式については,「検査制約の整合性チェックの処理結果」を参照してください。

(d) 制約違反キー値の出力数上限値による整合性チェックの中断

制約違反となった行データ数が制約違反キー値の出力数上限値を超えた場合,該当する制約の整合性チェックを終了します。制約違反キー値の出力数上限値は,-wオプションで変更できます。

(4) 整合性チェック結果による検査保留状態の遷移

pdconstckは,制約ごとに整合性チェックをした結果に基づいて,整合性の有無で表の検査保留状態,制約の検査保留状態,又はRDエリアの検査保留状態を,検査保留状態又は非検査保留状態に設定します。RDエリアの検査保留状態の遷移は,pdconstckの実行単位によって異なります。

次に,制約の検査保留状態の遷移,表の検査保留状態の遷移,及びRDエリアの検査保留状態の遷移について説明します。なお,検査制約と参照制約はそれぞれ別に,表の検査保留状態,制約の検査保留状態,又はRDエリアの検査保留状態を遷移します。

制約の検査保留状態の遷移

制約の検査保留状態は,制約ごとの整合性チェックの結果によって,制約ごとに遷移します。

制約の検査保留状態の遷移を次の表に示します。

表13‒7 制約の検査保留状態の遷移

制約の整合性チェック結果

制約の検査保留状態(設定する値)

整合性あり

非検査保留状態(NULL値)

整合性なし

検査保留状態('C')

表の検査保留状態の遷移

表の検査保留状態は各制約の検査保留状態によって遷移します。表の検査保留状態の遷移を次の表に示します。

表13‒8 表の検査保留状態の遷移

制約の検査保留状態

表の検査保留状態(設定する値)

すべての制約が非検査保留状態

非検査保留状態(NULL値)

検査保留状態と非検査保留状態の制約が混在

検査保留状態('C')

RDエリアの検査保留状態の遷移

RDエリアの検査保留状態は,各制約で行った整合性チェックの結果によって遷移します。RDエリアの検査保留状態の遷移を次の表に示します。

表13‒9 RDエリアの検査保留状態の遷移

整合性チェックの結果

RDエリアの検査保留状態(設定する値)

すべての制約が整合性あり

非検査保留状態(NULL値)

整合性がない制約と,整合性がある制約が混在

検査保留状態('C')

(a) 表単位で実行した場合の検査保留状態の遷移

表単位実行時は,制約ごとに整合性チェックをした結果によって,表の検査保留状態,制約の検査保留状態,及びRDエリアの検査保留状態を遷移します。

参照制約が定義された表に対して,表単位に整合性チェックを実行する例を次の図に示します。また,この例の検査保留状態の遷移を次の表に示します。

図13‒1 表単位での整合性チェック実行例

[図データ]

(凡例)

T1,T2:主キーが定義された表

T3:外部キー(REF1,REF2)が定義された表

CHK1,CHK2:参照制約

USR1〜USR4:表を格納しているユーザ用RDエリア

REF1,REF2:ほかの表を参照する外部キー

表13‒10 表単位での検査保留状態の遷移(実行例)

整合性チェックの結果

検査保留状態

REF1の整合性

REF2の整合性

表の検査保留状態

制約の検査保留状態

表格納用RDエリアの検査保留状態

REF1

REF2

USR1

USR2

あり

あり

N

N

N

N

N

なし

P

N

P

P

P

なし

あり

P

P

N

P

P

なし

P

P

P

P

P

(凡例)

P:検査保留状態

N:非検査保留状態

(b) 制約単位での検査保留状態の遷移

制約単位実行時は,指定した制約の整合性チェックをした結果によって,表の検査保留状態,指定した制約の検査保留状態,及びRDエリアの検査保留状態を遷移します。検査保留状態の遷移を次に説明します。

検査保留状態の遷移

指定した制約の整合性結果によって,制約の検査保留状態を遷移します。

図「表単位での整合性チェック実行例」の実行例について,制約CHK1に対して制約単位に整合性チェックをした場合の検査保留状態の遷移を次の表に示します。

表13‒11 制約単位での検査保留状態の遷移(実行例)

整合性チェックの結果

制約の検査保留状態

検査保留状態

CHK1の整合性

CHK2

表の検査保留状態

制約の検査保留状態

RDエリアの検査保留状態

CHK1

CHK2

U1

U2

あり

非検査保留状態

N

N

N

N

あり

検査保留状態

P

N

P

P

なし

非検査保留状態

P

P

P

P

なし

検査保留状態

P

P

P

P

(凡例)

P:検査保留状態

N:非検査保留状態

−:状態を変更しません

(5) 整合性チェックの順番と実行有無

(a) 表単位

整合性チェックの順番

表単位で整合性チェックをする場合,整合性チェックの順番は次のようになります。

参照制約と検査制約の順番

-tオプションで指定した表に参照制約及び検査制約の両方が定義されている場合,参照制約(外部キー),検査制約の順で整合性をチェックします。

同一制約内の順番

-tオプションで指定した表に同一制約が複数定義されている場合は,同一制約内の制約名称順に整合性をチェックします。

表単位の整合性チェックでの順番の例を次の表に示します。

表13‒12 表単位の整合性チェックでの順番の例

表の制約

整合性チェックの順番

参照制約(外部キー)

検査制約

参照制約(外部キー)

検査制約

F1

F2

C1

C2

あり

あり

1.

2.

3.

4.

なし

1.

2.

なし

あり

1.

2.

なし

(凡例)

F1,F2:参照制約(外部キー)の制約名

C1,C2:検査制約の制約名

1.〜4.:整合性チェックの検査順番

−:該当しません

整合性チェックの実行有無

表単位の整合性チェックは,検査保留状態となった制約だけ整合性を検査します。整合性をチェックする条件と整合性チェック実行有無を次の表に示します。

表13‒13 整合性をチェックする条件と整合性チェック実行有無

検査保留状態

整合性チェック実行有無

備考

表の検査保留状態

制約の検査保留状態

表格納用RDエリアの検査保留状態※1

検査保留状態('C')

検査保留状態('C')

検査保留状態

あり

pdconstckは正常状態と判断します(検査保留状態)。

非検査保留状態

あり

RDエリアが非検査保留状態であるが,ディクショナリ表が検査保留状態のため,整合性をチェックします。

非検査保留状態(NULL値)※2

検査保留状態

なし

pdconstckは正常状態と判断します(他制約が検査保留状態)。

非検査保留状態

あり

RDエリアが非検査保留状態であるが,ディクショナリ表が検査保留状態のため,整合性をチェックします。

非検査保留状態(NULL値)

検査保留状態('C')

検査保留状態

なし

ディクショナリ表が不正のため,pdconstckをエラー終了します。

非検査保留状態

なし

非検査保留状態(NULL値)※2

検査保留状態

あり

RDエリアが検査保留状態のため,整合性をチェックします。

非検査保留状態

なし

pdconstckは正常状態と判断します(非検査保留状態)。

注※1 

分割表の場合,表を格納する各RDエリア中の表情報によって,検査保留状態又は非検査保留状態になります。各表格納用RDエリア中の表情報による検査保留状態を次の表に示します。

表13‒14 各表格納用RDエリア中の表情報による検査保留状態

条件

表格納RDエリアの表情報

すべての格納RDエリアのRDエリアの検査保留状態が検査保留状態

検査保留状態

格納RDエリアのRDエリアの検査保留状態が検査保留状態と非検査保留状態が混在

検査保留状態

すべての格納RDエリアがRDエリアの検査保留状態が非検査保留状態

非検査保留状態

注※2 

表の検査保留状態と制約の検査保留状態の整合性が取れていない場合は,pdconstckはエラーで終了します。ディクショナリ表の検査保留状態でのpdconstckの動作を次の表に示します。

表13‒15 ディクショナリ表の検査保留状態でのpdconstckの動作

検査保留状態

pdconstckの動作

表の検査保留状態

制約の検査保留状態

検査保留状態

検査保留状態となった制約がある

処理続行

すべての制約が非検査保留状態

エラー終了

非検査保留状態

検査保留状態となった制約がある

エラー終了

すべての制約が非検査保留状態

処理続行

(b) 制約単位

整合性チェックの順番

制約単位の場合は,制約だけ整合性を検査するため,チェックの順番はありません。

整合性チェックの実行有無

制約単位の整合性チェックでは,表の検査保留状態に関係なく,上記の順に整合性をチェックします。