12.19.3 検査保留状態
SQLやユティリティの実行などで表間の参照整合性を保証できなくなった場合,HiRDBは参照表に対するデータ操作を制限します。このように,整合性を保証できないためにデータ操作を制限された状態を検査保留状態といいます。参照表を検査保留状態にして,データ操作を制限するためには,pd_check_pendingオペランドにUSEを指定するか,又はオペランドの指定を省略する必要があります。検査保留状態の表は,整合性チェックユティリティ(pdconstck)を使用して検査保留状態を解除します。また,整合性チェックユティリティを使用して,強制的に検査保留状態にもできます。
pd_check_pendingオペランドにNOUSEを指定していると,表間で参照整合性を保証できない場合でもデータ操作を制限しません。そのため,整合性が保証できなくなるSQLやユティリティを実行した場合は,整合性チェックユティリティで強制的に検査保留状態に設定してから,整合性を確認してください。
整合性が保証できなくなる操作については「データ操作と整合性」を,整合性の確認手順は「表の整合性確認手順」を参照してください。
- 〈この項の構成〉
(1) 検査保留状態の設定又は解除
整合性チェックユティリティ以外に,次に示すユティリティ,コマンド,及びSQLで参照表を検査保留状態に設定するかどうかを決めたり,又は検査保留状態を解除したりできます。
-
データベース作成ユティリティ(pdload)のconstraint文での指定
-
データベース再編成ユティリティ(pdrorg)(リロード,再編成)のconstraint文での指定
-
データベース構成変更ユティリティ(pdmod)(RDエリアの再初期化)
-
PURGE TABLE文
-
ALTER TABLE(CHANGE RDAREA)
それぞれの詳細について,ユティリティ及びコマンドはマニュアル「HiRDB Version 9 コマンドリファレンス」を,SQLはマニュアル「HiRDB Version 9 SQLリファレンス」を参照してください。
(2) 検査保留状態の管理
検査保留状態はディクショナリ表と,表が格納されたRDエリアの表情報で管理しています。ディクショナリ表では表単位,及び制約単位に検査保留状態を管理し,表情報では分割表の場合はRDエリア単位に,分割表ではない場合は表単位に検査保留状態を管理します。
検査保留状態の情報が格納されている場所と内容を次の表に示します。
格納場所 |
格納されている情報 |
||
---|---|---|---|
ディクショナリ表 |
SQL_TABLES表 |
CHECK_PEND列 |
表単位の参照制約の検査保留状態 |
SQL_REFERENTIAL_CONSTRAINTS表 |
CHECK_PEND列 |
制約単位の参照制約の検査保留状態 |
|
RDエリアの表情報 |
分割していない表の場合 |
表単位の参照制約又は検査制約の検査保留状態 |
|
分割表の場合 |
RDエリア単位の参照制約又は検査制約の検査保留状態 |
(3) 検査保留状態の表に対して制限される操作
検査保留状態の表に対してできなくなる操作を次の表に示します。なお,トリガ動作によって操作対象表にアクセスする場合,トリガSQL文に指定したSQLの操作可否に依存します。また,操作対象表がビュー表の場合,ビュー表の基になる実表の操作可否に依存します。
検査保留状態の表に対する操作 |
操作可否 |
||
---|---|---|---|
操作系SQL |
SELECT文 |
対象表の検索 |
△※1 |
対象表から作成したリストの検索 |
|||
INSERT文 |
対象表への挿入 |
||
UPDATE文 |
対象表の更新 |
||
DELETE文 |
対象表からの行削除 |
||
ASSIGN LIST文 |
対象表からのリスト作成 |
||
ユティリティ |
リバランスユティリティ(pdrbal) |
× |
|
データベース再編成ユティリティ(pdrorg) |
再編成 |
△※2 |
- (凡例)
-
△:場合によっては操作できません。
×:操作できません。
- 注※1
-
次の条件をどちらも満たす場合だけ,操作できます。それ以外は操作できません。
-
操作対象表が分割表で,分割条件がキーレンジ分割又はFIXハッシュ分割
-
操作対象となるRDエリアが検査保留状態でない
-
- 注※2
-
フレキシブルハッシュ分割の分割表に対して再編成を実行する場合,操作できないときがあります。詳細は,マニュアル「HiRDB Version 9 コマンドリファレンス」の「データベース再編成ユティリティ(pdrorg)」の「規則及び注意事項」を参照してください。
(4) 検査保留状態の表と参照関係がある表に対して制限される操作
次のような参照関係がある表を例に説明します。この場合,検査保留状態になるのは表T2と表T3だけです。
表T2と表T3が検査保留状態の場合,各表に対して制限される操作について次に示します。
(a) 表T2だけが検査保留状態の場合
表T2だけが検査保留状態の場合,各表に対して制限される操作を次の表に示します。
操作対象表 |
制限される操作 |
制限の内容 |
---|---|---|
表T1 |
UPDATE(対象表の更新) |
表T2に定義されている参照制約動作指定によって異なります。
|
DELETE(対象表からの行削除) |
||
表T2 |
SELECT文(対象表の検索及び対象表から作成したリストの検索) |
次の条件をどちらも満たす場合だけ,操作できます。それ以外は操作できません。
|
INSERT文(対象表への挿入) |
||
UPDATE文(対象表の更新) |
||
DELETE文(対象表からの行削除) |
||
ASSIGN LIST文(対象表からのリスト作成) |
||
リバランスユティリティ(pdrbal) |
操作できません。 |
|
データベース再編成ユティリティ(pdrorg)による再編成 |
フレキシブルハッシュ分割の分割表に対して再編成を実行する場合,操作できないときがあります。詳細は,マニュアル「HiRDB Version 9 コマンドリファレンス」の「データベース再編成ユティリティ(pdrorg)」を参照してください。 |
|
表T3 |
制限される操作はありません。INSERT及びDELETEの場合,被参照表T2を参照し,整合性チェックを行います。 |
(b) 表T3だけが検査保留状態の場合
表T3だけが検査保留状態の場合,各表に対して制限される操作を次の表に示します。
操作対象表 |
制限される操作 |
制限の内容 |
---|---|---|
表T1 |
UPDATE(対象表の更新) |
表T2及び表T3に定義されている参照制約動作がCASCADEで,参照制約動作の操作対象となるRDエリアの表情報が検査保留状態のときは操作できません。ただし,同値更新のときは操作できます。 |
DELETE(対象表からの行削除) |
||
表T2 |
UPDATE(対象表の更新) |
表T2及び表T3に定義されている参照制約動作指定によって異なります。
|
DELETE(対象表からの行削除) |
||
表T3 |
SELECT文(対象表の検索及び対象表から作成したリストの検索) |
次の条件をどちらも満たす場合だけ,操作できます。それ以外は操作できません。
|
INSERT文(対象表への挿入) |
||
UPDATE文(対象表の更新) |
||
DELETE文(対象表からの行削除) |
||
ASSIGN LIST文(対象表からのリスト作成) |
||
リバランスユティリティ(pdrbal) |
操作できません。 |
|
データベース再編成ユティリティ(pdrorg)による再編成 |
フレキシブルハッシュ分割の分割表に対して再編成を実行する場合,操作できないときがあります。詳細は,マニュアル「HiRDB Version 9 コマンドリファレンス」の「データベース再編成ユティリティ(pdrorg)」を参照してください。 |
(c) 表T2及び表T3が検査保留状態の場合
表T2及び表T3が検査保留状態の場合,各表に対して制限される操作を次の表に示します。
操作対象表 |
制限される操作 |
制限の内容 |
---|---|---|
表T1 |
UPDATE(対象表の更新) |
表T2及び表T3に定義されている参照制約動作がCASCADEで,参照制約動作の操作対象となるRDエリアの表情報が検査保留状態のときは操作できません。ただし,同値更新のときは操作できます。 表T2及び表T3に定義されている参照制約動作指定がRESTRICTの場合,操作できます。参照表T2を参照し,整合性チェックを行います。 |
DELETE(対象表からの行削除) |
||
表T2 |
SELECT文(対象表の検索及び対象表から作成したリストの検索) |
次の条件をどちらも満たす場合だけ,操作できます。それ以外は操作できません。
|
INSERT文(対象表への挿入) |
||
UPDATE文(対象表の更新) |
||
DELETE文(対象表からの行削除) |
||
ASSIGN LIST文(対象表からのリスト作成) |
||
リバランスユティリティ(pdrbal) |
操作できません。 |
|
データベース再編成ユティリティ(pdrorg)による再編成 |
フレキシブルハッシュ分割の分割表に対して再編成を実行する場合,操作できないときがあります。詳細は,マニュアル「HiRDB Version 9 コマンドリファレンス」の「データベース再編成ユティリティ(pdrorg)」を参照してください。 |
|
表T3 |
SELECT文(対象表の検索及び対象表から作成したリストの検索) |
次の条件をどちらも満たす場合だけ,操作できます。それ以外は操作できません。
|
INSERT文(対象表への挿入) |
||
UPDATE文(対象表の更新) |
||
DELETE文(対象表からの行削除) |
||
ASSIGN LIST文(対象表からのリスト作成) |
||
リバランスユティリティ(pdrbal) |
操作できません。 |
|
データベース再編成ユティリティ(pdrorg)による再編成 |
フレキシブルハッシュ分割の分割表に対して再編成を実行する場合,操作できないときがあります。詳細は,マニュアル「HiRDB Version 9 コマンドリファレンス」の「データベース再編成ユティリティ(pdrorg)」を参照してください。 |
(5) 分割表を使用している場合
RDエリア単位に検査保留状態を管理しているため,分割表で,実際に操作するRDエリアの表情報が検査保留状態の場合,その分割表に対する操作は制限されることがあります。それぞれについて説明します。
分割表で,データを格納している一部のRDエリアが検査保留状態の場合の例を次の図に示します。
|
- 〔説明〕
-
分割表Aに対してSELECT文を実行する場合,実際に操作するデータがRDエリア2(表情報が検査保留状態)にあると,SELECT文はエラーになります。RDエリア1及び3にあるデータに対する操作の場合,SELECT文は正常に実行できます。
- 分割表の場合の注意事項
-
pd_check_pendingオペランドにUSEを指定していて,参照表のデータを分割格納しているRDエリアを再初期化する場合,再初期化後に整合性チェックユティリティで表単位の整合性チェックを実行してください。
(6) 検査保留状態を使用する場合の注意
-
pd_check_pendingオペランドの指定値をNOUSEからUSEに変更した場合,整合性チェックユティリティを使用して,参照表の整合性を確認する必要があります。確認手順については,「表の整合性確認手順」を参照してください。
-
pd_check_pendingオペランドにUSEを指定していて,参照整合性を保証できなくなる操作をした場合でも,RDエリアの状態によっては検査保留状態を設定できないことがあります。このため,pd_check_pendingオペランドの指定値をNOUSEからUSEに変更すると,検査保留状態を使用していない場合は正常だった操作がエラーになることがあります。PURGE TABLE文,又はALTER TABLE(CHANGE RDAREA)実行時,検査保留状態を設定できるRDエリアの状態を次に示します。
オープン契機がINITIALの場合
-
RDエリアが閉塞なし,オープン状態のとき
-
RDエリアが更新可能バックアップ閉塞,かつオープン状態のとき
オープン契機がDEFER又はSCHEDULEの場合
-
RDエリアが閉塞なしのとき
-
RDエリアが更新可能バックアップ閉塞のとき
ユティリティ実行時,検査保留状態を設定できるRDエリアについては,マニュアル「HiRDB Version 9 コマンドリファレンス」の「コマンド実行時のRDエリアの状態」の「検査保留状態の設定可否」を参照してください。
-
-
pd_check_pendingオペランドにUSEを指定する場合,検査保留状態に設定される参照表及びRDエリアに対して排他が掛かるため,ユティリティ及びSQL実行時の排他資源が検査保留状態を使用しない場合とは異なります。