13.2.1 整合性チェック機能

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

参照制約の整合性チェック
参照制約に基づいて,表の外部キーの値が,その表が参照する表の主キーと同じ値を持つかどうかをチェックします。チェックの結果,制約に違反する行がない場合は,検査保留状態を解除します。制約に違反する行がある場合は,検査保留状態を設定します。ただし,外部キー値にナル値を含む行はチェック対象としません。なお,参照制約の整合性チェックは,データベースの容量によっては時間が掛かることがあります。実行時間については,「(2)(a)参照制約の整合性チェック方法」のSQLから見積もってください。
検査制約の整合性チェック
検査制約の定義に基づいて,行の値が検査制約の範囲内であるかどうかをチェックします。チェックの結果,制約に違反する行がない場合は,検査保留状態を解除します。制約に違反する行がある場合は,検査保留状態を設定します。なお,検査制約の整合性チェックは,データベースの容量によっては時間が掛かることがあります。実行時間については,「(3)(a)検査制約の整合性チェック方法」のSQLから見積もってください。
<この項の構成>
(1) 整合性チェック機能の実行単位
(2) 参照制約の整合性チェック
(3) 検査制約の整合性チェック
(4) 整合性チェック結果による検査保留状態の遷移
(5) 整合性チェックの順番と実行有無

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

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

また,インナレプリカ機能を使用して表単位に実行する場合は,次のどれかの単位で実行します。

(a) 表単位

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

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

全世代単位
検査保留状態となった表に定義された,参照制約及び検査制約のすべての制約で,制約ごとに表を格納するオリジナルRDエリア及びレプリカRDエリアを作成したすべての世代に対し,世代ごとに整合性チェックをします。適用基準は表単位と同じです。全世代単位で整合性チェックをする場合は,-q allを指定します。
世代単位
表に定義された参照制約及び検査制約のうち,検査保留状態となったすべての制約について,制約ごとに,-qオプションで指定した世代だけ整合性チェックをします。世代単位で整合性チェックをする場合は,-qオプションで世代番号を指定します。
世代単位の整合性チェックは,検査保留状態となった特定の世代だけ違反があるかどうかを検査し,検査保留状態を解除する場合に適用します。
カレントRDエリアの世代単位
表に定義された参照制約及び検査制約のうち,検査保留状態となったすべての制約について,制約ごとに,カレントRDエリアの世代の整合性チェックをします。カレントRDエリアの世代単位で整合性チェックをする場合は,-qオプションを省略します。
カレントRDエリアの世代単位の整合性チェックは,pdloadなどをカレントRDエリアの世代に対して実行し,表が検査保留状態となった場合,違反があるかどうかカレントRDエリアの世代だけを検査し,検査保留状態を解除するときに適用します。
(b) 制約単位

検査保留状態に関係なく,一つの制約だけの整合性を検査します。制約単位で整合性を検査する場合は,-cオプションを指定します。インナレプリカ機能を使用している場合,指定した制約が定義された表を格納するオリジナルRDエリア及びレプリカRDエリアを作成したすべての世代に対して,世代ごとに整合性チェックをします。

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

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

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

参照制約の整合性チェックでは,制約ごとに次のSQLで整合性をチェックします。インナレプリカ機能を使用する場合は,該当する制約の整合性を世代ごとに検査します。

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

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

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

SQLCODE(検索行数)整合性の有無
100(0件)整合性あり
0(1件以上)整合性なし
上記以外実行エラー
(c) 制約違反となったキー値の出力

(a)のSQLを実行した結果,制約違反となったキー値を処理結果ファイルに出力します。なお,制約違反となったキー値は重複排除して出力します。

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

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

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

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

検査制約の整合性チェックでは,制約ごとに次のSQLで整合性をチェックします。インナレプリカ機能を使用する場合は,該当する制約の整合性を世代ごとに検査します。

このSQLでは作業表を作成する場合があるため,シングルサーバ又はバックエンドサーバに,作業表を格納する作業表用ファイルが必要となります。作業表用ファイルの容量見積もりについては,マニュアル「HiRDB Version 8 システム導入・設計ガイド」を参照してください。
注※
探索条件に指定した列定義が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')
使用するすべての世代で整合性あり非検査保留状態(NULL値)
整合性がある世代と整合性がない世代が混在検査保留状態('C')
注※ 整合性チェックをしなかった制約(世代)は,整合性ありと判断します。

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

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

制約の検査保留状態表の検査保留状態(設定する値)
すべての制約が非検査保留状態非検査保留状態(NULL値)
検査保留状態と非検査保留状態の制約が混在検査保留状態('C')
RDエリアの検査保留状態の遷移
RDエリアの検査保留状態は,各制約(各世代)で行った整合性チェックの結果によって遷移します。RDエリアの検査保留状態の遷移を次の表に示します。

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

整合性チェックの結果RDエリアの検査保留状態(設定する値)
すべての制約が整合性あり非検査保留状態(NULL値)
整合性がない制約と,整合性がある制約が混在検査保留状態('C')
(a) 表単位で実行した場合の検査保留状態の遷移

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

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

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

[図データ]

(凡例)
T1,T2:主キーが定義された表
T3:外部キー(REF1,REF2)が定義された表
CHK1,CHK2:参照制約
USR1~USR4:表を格納しているユーザ用RDエリア
REF1,REF2:ほかの表を参照する外部キー

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

整合性チェックの結果検査保留状態
REF1の整合性REF2の整合性表の検査保留状態制約の検査保留状態表格納用RDエリアの検査保留状態
REF1REF2USR1USR2
ありありNNNNN
なしPNPPP
なしありPPNPP
なしPPPPP
(凡例)
P:検査保留状態
N:非検査保留状態

(b) 全世代単位で実行した場合の検査保留状態の遷移

インナレプリカ機能使用時に全世代単位で実行する場合は,制約ごと(世代ごと)に整合性チェックをした結果によって,表の検査保留状態,制約の検査保留状態,及びRDエリアの検査保留状態を遷移します。

検査制約が定義された表が,インナレプリカ機能を使用して1世代のレプリカRDエリアを作成している場合,全世代単位で整合性チェックを実行する例を図13-2に示します。また,検査保留状態の遷移を表13-11に示します。

図13-2 全世代単位での整合性チェック実行例

[図データ]

(凡例)
U1,U2:オリジナルRDエリア
U1G1,U2G1:レプリカRDエリア
CHK1,CHK2:表T1の検査制約

表13-11 全世代単位での検査保留状態の遷移(実行例)

整合性チェックの結果検査保留状態
CHK1の整合性CHK2の整合性表の検査保留状態制約の検査保留状態RDエリアの検査保留状態
世代0世代1世代0世代1CHK1CHK2U1U2U1G1U2G1
ありありありありNNNNNNN
ありありありなしPNPNNPP
ありありなしありPNPPPNN
ありありなしなしPNPPPPP
ありなしありありPPNNNPP
ありなしありなしPPPNNPP
ありなしなしありPPPPPPP
ありなしなしなしPPPPPPP
なしありありありPPNPPNN
なしありありなしPPPPPPP
なしありなしありPPPPPNN
なしありなしなしPPPPPPP
なしなしありありPPNPPPP
なしなしありなしPPPPPPP
なしなしなしありPPPPPPP
なしなしなしなしPPPPPPP
(凡例)
P:検査保留状態
N:非検査保留状態

(c) 世代単位での検査保留状態の遷移

インナレプリカ機能使用時に世代単位で実行する場合,制約ごとに指定世代の整合性チェックをした結果によって,表の検査保留状態,制約の検査保留状態,及び指定した世代のRDエリアの検査保留状態を遷移します。

世代単位での整合性チェック結果による制約とRDエリアの検査保留状の遷移を次の表に示します。

表13-12 世代単位での整合性チェック結果による制約とRDエリアの検査保留状の遷移

実行結果制約の検査保留状態RDエリアの検査保留状態
該当世代のチェック結果他世代のRDエリア中の検査保留状態
すべての制約が整合性ありすべて非検査保留状態すべての制約を非検査保留状態にします。該当する世代を非検査保留状態にします。
上記以外遷移しません。該当する世代を非検査保留状態にします。
上記以外整合性ありの制約遷移しません。該当する世代を検査保留状態にします。
整合性なしの制約検査保留状態にします。該当する世代を検査保留状態にします。
(凡例)
-:該当しません。

図13-2の実行例について,世代1に対して世代単位に整合性チェックをした場合の検査保留状態の遷移を次の表に示します。

表13-13 世代単位での検査保留状態の遷移(実行例)

整合性チェックの結果RDエリアの検査保留状態検査保留状態
表の検査保留状態制約の検査保留状態RDエリアの検査保留状態
CHK1の整合性CHK2の整合性世代0CHK1CHK2U1G1U2G1U1U2
ありあり非検査保留状態NNNNN(N)(N)
ありあり検査保留状態(P)(P)(P)NN(P)(P)
ありなし非検査保留状態P(P)PPP(N)(N)
ありなし検査保留状態P(P)PPP(P)(P)
なしあり非検査保留状態PP(P)PP(N)(N)
なしあり検査保留状態PP(P)PP(P)(P)
なしなし非検査保留状態PPPPP(N)(N)
なしなし検査保留状態PPPPP(P)(P)
(凡例)
P:検査保留状態
N:非検査保留状態
(P):遷移なし(検査保留状態のまま)
(N):遷移なし(非検査保留状態のまま)

(d) カレントRDエリアの世代単位での検査保留状態の遷移

インナレプリカ機能使用時にカレントRDエリアの世代単位で実行する場合は,制約ごとに指定世代の整合性チェックをした結果によって,表の検査保留状態,制約の検査保留状態,及び指定した世代のRDエリアの検査保留状態を遷移します。

カレントRDエリアの世代単位に整合性チェックをしたときの検査保留状態の遷移は,「(c)世代単位での検査保留状態の遷移」と同じです。

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

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

検査保留状態の遷移(インナレプリカ機能を使用しない場合)

インナレプリカ機能を使用しない場合,指定した制約の整合性結果によって,制約の検査保留状態を遷移します。

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

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

整合性チェックの結果制約の検査保留状態検査保留状態
CHK1の整合性CHK2表の検査保留状態制約の検査保留状態RDエリアの検査保留状態
CHK1CHK2U1U2
あり非検査保留状態NNNN
あり検査保留状態PNPP
なし非検査保留状態PPPP
なし検査保留状態PPPP
(凡例)
P:検査保留状態
N:非検査保留状態
-:状態を変更しません

検査保留状態の遷移(インナレプリカ機能を使用する場合)
インナレプリカ機能を使用する場合,指定した制約の世代ごとの整合性チェック結果によって,制約の検査保留状態,各世代のRDエリアの検査保留状態,及び表の検査保留状態を遷移します。
図13-2に示した実行例について,制約CHK1に対して制約単位に整合性チェックをした場合の検査保留状態の遷移を次の表に示します。

表13-15 インナレプリカ機能使用時の制約単位での検査保留状態の遷移(実行例)

整合性チェックの結果ほかの検査保留状態検査保留状態
表の検査保留状態制約の検査保留状態RDエリアの検査保留状態
CHK1の世代0整合性CHK1の世代1整合性CHK2CHK1CHK2U1U2U1G1U2G1
ありあり非検査保留状態NNNNNN
ありあり検査保留状態PNPPPP
ありなし非検査保留状態PPPPPP
ありなし検査保留状態PPPPPP
なしあり非検査保留状態PPPPPP
なしあり検査保留状態PPPPPP
なしなし非検査保留状態PPPPPP
なしなし検査保留状態PPPPPP
(凡例)
P:検査保留状態
N:非検査保留状態
-:状態を変更しません

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

(a) 表単位
整合性チェックの順番
表単位で整合性チェックをする場合,整合性チェックの順番は次のようになります。
参照制約と検査制約の順番
-tオプションで指定した表に参照制約及び検査制約の両方が定義されている場合,参照制約(外部キー),検査制約の順で整合性をチェックします。
同一制約内の順番
-tオプションで指定した表に同一制約が複数定義されている場合は,同一制約内の制約名称順に整合性をチェックします。
表単位の整合性チェックでの順番の例を次の表に示します。

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

表の制約整合性チェックの順番
参照制約(外部キー)検査制約参照制約(外部キー)検査制約
F1F2C1C2
ありあり1.2.3.4.
なし1.2.
なしあり1.2.
なし
(凡例)
F1,F2:参照制約(外部キー)の制約名
C1,C2:検査制約の制約名
1.~4.:整合性チェックの検査順番
-:該当しません

インナレプリカ使用時の世代ごとの整合性チェックの順番と,世代ごとの実行可否
表単位の整合性チェック(全世代単位)の場合,制約ごとにオリジナルRDエリア(世代番号0),世代番号1から昇順に整合性チェックをします。
整合性チェックの実行有無
表単位の整合性チェックは,検査保留状態となった制約だけ整合性を検査します。なお,インナレプリカ機能を使用する場合は,検査保留状態となった制約の世代だけ整合性をチェックします。整合性をチェックする条件と整合性チェック実行有無を次の表に示します。

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

検査保留状態整合性チェック実行有無備考
表の検査保留状態制約の検査保留状態表格納用RDエリアの検査保留状態1
検査保留状態('C')検査保留状態('C')検査保留状態ありpdconstckは正常状態と判断します(検査保留状態)。
非検査保留状態ありRDエリアが非検査保留状態であるが,ディクショナリ表が検査保留状態のため,整合性をチェックします。
非検査保留状態(NULL値)2検査保留状態なしpdconstckは正常状態と判断します(他制約が検査保留状態)。
非検査保留状態ありRDエリアが非検査保留状態であるが,ディクショナリ表が検査保留状態のため,整合性をチェックします。
非検査保留状態(NULL値)検査保留状態('C')検査保留状態なしディクショナリ表が不正のため,pdconstckをエラー終了します。
非検査保留状態なし
非検査保留状態(NULL値)2検査保留状態ありRDエリアが検査保留状態のため,整合性をチェックします。
非検査保留状態なしpdconstckは正常状態と判断します(非検査保留状態)。
注※1 
分割表の場合,表を格納する各RDエリア中の表情報によって,検査保留状態又は非検査保留状態になります。各表格納用RDエリア中の表情報による検査保留状態を次の表に示します。
また,インナレプリカ機能を使用している場合,世代ごとに検査保留状態又は非検査保留状態となります。世代中の各表格納用RDエリア中の表情報による検査保留状態を表13-19に示します。

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

条件表格納RDエリアの表情報
すべての格納RDエリアのRDエリアの検査保留状態が検査保留状態検査保留状態
格納RDエリアのRDエリアの検査保留状態が検査保留状態と非検査保留状態が混在検査保留状態
すべての格納RDエリアがRDエリアの検査保留状態が非検査保留状態非検査保留状態

表13-19 世代中の各表格納用RDエリア中表情報による検査保留状態

条件表格納RDエリアの表情報
世代中の処理対象格納RDエリアすべてRDエリアの検査保留状態が検査保留状態検査保留状態
世代中の処理対象格納RDエリアの検査保留状態が非検査保留状態検査保留状態
世代中の処理対象格納RDエリアすべてRDエリアの検査保留状態が非検査保留状態非検査保留状態
注※2 
表の検査保留状態と制約の検査保留状態の整合性が取れていない場合は,pdconstckはエラーで終了します。ディクショナリ表の検査保留状態でのpdconstckの動作を次の表に示します。

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

検査保留状態pdconstckの動作
表の検査保留状態制約の検査保留状態
検査保留状態検査保留状態となった制約がある処理続行
すべての制約が非検査保留状態エラー終了
非検査保留状態検査保留状態となった制約があるエラー終了
すべての制約が非検査保留状態処理続行
(b) 制約単位
整合性チェックの順番
制約単位の場合は,制約だけ整合性を検査するため,チェックの順番はありません。ただし,インナレプリカ機能を使用する場合は,次に示す順番で整合性をチェックします。
インナレプリカ使用時の世代ごとのチェック順番
制約単位の整合性チェックの場合,オリジナルRDエリア(世代番号0),世代番号1から昇順に整合性をチェックします。
整合性チェックの実行有無
制約単位の整合性チェックでは,表の検査保留状態に関係なく,上記の順に整合性をチェックします。