12.19.5 表の整合性確認手順
データの整合性確認手順の概要を次の図に示します。
|
pd_check_pendingオペランドの指定値がUSE又は省略の場合
-
検査保留状態の表の特定
ディクショナリ表のSQL_TABLES表を検索して,検査保留状態の表名を検出します。
SELECT TABLE_SCHEMA, TABLE_NAME FROM MASTER.SQL_TABLES WHERE CHECK_PEND = 'C' OR CHECK_PEND2 = 'C'
検索結果には,検査保留状態の表の所有者と検査保留状態の表名が返されます。検索結果が0行の場合,検査保留状態の表はありません。
なお,インナレプリカ機能使用時に,各世代の表が検査保留状態かどうかを確認するためには,状態解析ユティリティ(pddbst)を使用します。
-
整合性チェックユティリティを使用した整合性チェック
整合性チェックユティリティで表単位の整合性チェックを実行し,制約違反データがあれば修正します。検査保留状態の表がなくなるまで整合性チェックを繰り返し,なくなれば終了です。整合性チェックユティリティを使用した整合性確認手順については,「検査保留状態を使用する場合の整合性確認手順(参照制約)」を参照してください。
pd_check_pendingオペランドの指定値がNOUSEの場合
-
整合性チェックをする表を特定し,強制的に検査保留状態に設定
整合性チェックをする表を特定するために,次のことを確認します。
-
参照整合性を保証できなくなる操作をした表を被参照表とする参照表が存在するかどうか
-
参照整合性を保証できなくなる操作をした表に参照制約が定義されているかどうか
これらを確認するSQLの実行例を次に示します。
SELECT N_PARENTS, N_CHILDREN FROM MASTER.SQL_TABLES WHERE TABLE_SCHEMA = '対象表の所有者名' AND TABLE_NAME = '対象表の表名'
次の検索結果が返されます。
-
対象表に定義した外部キーの数
-
対象表に定義した主キーを参照する外部キーの数
N_PARENTSがナル値の場合,対象表に参照制約は定義されていません。
N_CHILDRENがナル値の場合,対象表を被参照表とする参照表は存在しません。
N_CHILDRENがナル値以外の場合,次に示すSQLを実行し,対象表を参照する参照表の表名を確認してください。
SELECT TABLE_SCHEMA, TABLE_NAME, CONSTRAINT_NAME FROM MASTER.SQL_REFERENTIAL_CONSTRAINTS WHERE R_OWNER = '対象表の所有者名' AND R_TABLE_NAME = '対象表の表名'
検索結果には,対象表を被参照表とする参照表の所有者名,表名及び参照制約の制約名が返されます。検索結果が0行の場合,対象表を被参照表とする参照表はありません。
表を特定したら,整合性チェックユティリティを使用して,その表を強制的に検査保留状態に設定します(検査保留状態でない表は,整合性チェックユティリティでチェックできません)。
-
-
整合性チェックユティリティを使用した整合性チェック
pd_check_pendingオペランドの指定値がUSE又は省略の場合の手順2.と同じです。整合性チェックユティリティを使用した整合性確認手順については,「検査保留状態を使用しない場合の整合性確認手順」を参照してください。
(1) 検査保留状態を使用する場合の整合性確認手順(参照制約)
pd_check_pendingオペランドの指定値がUSE又は省略の場合の,整合性チェックユティリティを使用した整合性確認手順を次の図に示します。
|
-
確認する表の整合性チェック
表単位,又は制約単位に整合性チェックをします。
インナレプリカ機能を使用している場合,確認する表の世代番号を指定します。インナレプリカ機能を使用していない場合,又は全世代に整合性チェックを実行する場合,世代番号の指定は不要です。
-
制約違反有無判定
手順1.の整合性チェック結果で,制約違反データの有無を判定します。
-
違反データの修正方法
違反データの修正をユティリティで行うか,SQLで行うかを選択します。ユティリティで行う場合,手順6.へ進んでください。
-
確認する表の操作抑止
整合性が保証できない表を使用する業務の運用を停止します。
-
確認する表の検査保留状態を強制解除
制約違反の対策をするため,検査保留状態を強制解除します。
-
制約違反の対策
- ユティリティで修正する場合
-
対策方法を次に示します。対策後,手順1.に戻り,整合性チェックを実行し,違反データがないことを確認し,終了します。
条件
対策方法
主キーに必要なデータがない場合
データベース作成ユティリティ(pdload)の追加モードで正しいデータをロードします。
外部キーに制約違反データがある場合
-
データベース作成ユティリティ(pdload)の作成モードで正しいデータをロードします。
-
データベース再編成ユティリティ(pdrorg)のUOCを使用して不要なデータを削除します。
-
- SQLで修正する場合
-
対策方法を次に示します。対策後,手順7.に進みます。
条件
対策方法
主キーに必要なデータがない場合
主キーに必要なデータをINSERT文で挿入します※1。又は,被参照表の既存のデータをUPDATE文で更新します※2。
外部キーに制約違反データがある場合
外部キーの制約違反データをDELETE文で削除,又は,UPDATE文で正しい値に更新します※1。
- 注※1
-
外部キーが主キーでもあり,対策を行う表を被参照表とする参照表が存在する場合,修正順序に注意が必要です。例えば,次のような参照関係があるとします。
●REF1の制約違反の対策をする場合の注意
表T2のデータをDELETE文で修正する場合,REF2でON DELETE RESTRICTを指定しているときは,対応する表T3のデータを先に削除後,表T2のデータを削除してください。また,UPDATE文で修正する場合,REF2でON UPDATE RESTRICTを指定しているときは,更新前のデータに対応する表T3のデータを削除後,表T2のデータを更新してください。
●REF2の制約違反の対策をする場合の注意
表T2のデータをINSERT文で修正する場合,表T1に挿入対象のデータが存在するかどうか確認します。存在しないときは,先に表T1にデータを挿入後,表T2にデータを挿入してください。また,UPDATE文で修正する場合,更新後のデータが表T1に存在するかどうか確認します。存在しないときは,先に表T1にデータを挿入後,表T2のデータを更新してください。
- 注※2
-
対策をする制約とは別の制約で,その表を被参照表とする参照表が存在する場合,修正順序に注意が必要です。例えば,次のような参照関係があるとします。
●REF1の制約違反の対策をする場合の注意
T1のデータをUPDATE文で修正する場合,REF2でON UPDATE RESTRICTを指定しているときは,更新前のデータに対応するT3のデータを削除後,T2のデータを更新してください。
-
違反があった制約を,強制的に検査保留状態に設定
整合性チェックユティリティを制約単位で実行し,対策をした制約を強制的に検査保留状態に設定します。
-
確認する表の操作抑止解除
運用を停止していた業務を再開します。手順1.に戻り,整合性チェックを実行し,違反データがないことを確認します。
-
確認する世代の有無
複数世代のレプリカRDエリアを作成している場合,又は世代単位の整合性チェックを実行した場合,手順1.に戻り,各世代で整合性チェックを実行します。
(2) 検査保留状態を使用しない場合の整合性確認手順
pd_check_pendingオペランドの指定値がNOUSEの場合の,整合性チェックユティリティを使用した整合性確認手順を次の図に示します。
|
-
確認する表の操作抑止
整合性が保証できない表を使用する業務の運用を停止します。
-
確認する表を強制的に検査保留状態に設定
確認する表を強制的に検査保留状態に設定します。なお,手順3.で制約単位の整合性チェックをする場合は,この操作は不要です。
-
確認する表の整合性チェック
表単位,又は制約単位に整合性チェックをします。
インナレプリカ機能を使用している場合,確認する表の世代番号を指定します。インナレプリカ機能を使用していない場合,又は全世代に整合性チェックを実行する場合,世代番号の指定は不要です。
-
制約違反有無判定
手順3.の整合性チェック結果で,制約違反データの有無を判定します。
-
制約違反の対策
「検査保留状態を使用する場合の整合性確認手順(参照制約)」の手順6.を参照して,同様に制約違反データを修正してください。
-
確認する世代の有無
複数世代のレプリカRDエリアを作成している場合,又は世代単位の整合性チェックを実行した場合,手順1.に戻り,各世代で整合性チェックを実行してください。
-
確認する表の操作抑止解除
運用を停止していた業務を再開します。