8.10.15 constraint文(検査保留状態に関する記述)
検査保留状態に関する指定をします。
検査制約又は参照制約を定義した表の再編成では,UOCを使用して被参照表中の参照表が参照している行を削除した場合を除いて,制約の整合性が保証できるため,検査保留状態は変更しません。UOCを使用して被参照表を再編成する場合だけ検査保留状態を設定します。
また,リロードでは,古いアンロードデータファイルを使用してリロードしたり,別表へのリロードをしたりする場合,制約の整合性が保証できなくなる可能性があります。そのため,該当する表や,その表に関係する参照表を検査保留状態に設定します。
なお,ユーザ自身が制御文を指定して,検査保留状態を変更(設定)しないこともできます。検査保留状態については,マニュアル「HiRDB システム導入・設計ガイド」を参照してください。
- <適用基準>
-
整合性を保証できる場合は,constraint文を指定することをお勧めします(表の検査保留状態を変更(設定)しない運用)。ただし,次に示す条件に該当する場合は,制約の整合性がなくなる可能性があるため,constraint文を省略することをお勧めします。
-
古いアンロードデータファイルを使用したリロード
参照表,又は被参照表のアンロード後に,アンロードした表のデータが更新された場合,表更新前のアンロードデータファイルを使用してリロードすると,更新前の表データに置き換わるため,被参照表及び参照表間のデータの整合性を保証できないことがあります。
-
別表又は制約定義を変更した表へのリロード
アンロードした表とは別の表へリロードする場合,pdrorgはデータの整合性チェックをしないため,制約の整合性が保証できないデータをリロードすることがあります。
-
UOCで行を削除する再編成
被参照表の再編成時にUOCを使用する場合,UOCを使用して行データを削除すると,整合性がなくなる可能性があります。
-
- <規則>
-
-
constraint文は,再編成(-k rorg)又はリロード(-k reld)で,かつシステム定義のpd_check_pendingオペランドの値がUSEの場合に指定できます。
システム定義のpd_check_pendingオペランドの値がNOUSEの場合,又はほかの機能(アンロード(-k unld)など)の場合は,この制御文の指定は無視され,表の検査保留状態を変更しません。
-
(1) 形式
constraint 〔pending=no〕 〔ref_pending=no〕
(2) 説明
(a) pending=no
参照表又は検査制約を定義した表に対して,再編成又はリロードをする場合,その表の検査保留状態を変更(設定)しないときに指定します。このオペランドを省略した場合の仮定値は,「検査保留状態の設定範囲」を参照してください。
(b) ref_pending=no
被参照表に対して再編成又はリロードをする場合,その表に関係する参照表の検査保留状態を変更(設定)しないときに指定します。このオペランドを省略した場合の仮定値は,「検査保留状態の設定範囲」を参照してください。
(3) 注意事項
-
被参照表に対して再編成又はリロードをする場合,その表に関係する参照表を検査保留状態に設定するときの注意事項については,「コマンド実行時のRDエリアの状態」を参照してください。
-
インナレプリカ機能使用時に被参照表に対して再編成又はリロードをする場合,その表に関係する参照表を検査保留状態に設定するときに,参照表を格納するレプリカRDエリアが-qオプションに指定した世代にないと,カレントRDエリアが検査保留状態となります。
-
検査保留状態を設定する場合,リロードした件数が0件で,かつ制約の整合性が保証できるときでも,表を検査保留状態に設定します。
-
検査保留状態を設定する再編成実行時にエラーが発生し,再編成を再実行した場合は,再度,表を検査保留状態に設定します。
-
検査保留状態を設定する場合,関連する資源に対して排他が掛かります。また,検査保留状態の設定が完了したとき,掛かっていた排他が解除されます。排他制御については,「コマンド実行時の排他制御モード」を参照してください。
(4) 検査保留状態の設定範囲
pdrorg実行条件と検査保留状態の設定有無の関係を次の表に示します。
実行条件 |
検査保留状態設定有無 |
||||||
---|---|---|---|---|---|---|---|
システム定義のpd_check_pendingオペランドの値 |
実行機能 |
constraint文のオペランド指定 |
UOC使用 |
対象表 |
|||
被参照表 |
参照表 |
検査制約が定義された表 |
|||||
USE |
再編成 |
pending=no |
あり |
あり |
× |
× |
× |
なし |
× |
× |
× |
||||
なし |
あり |
× |
× |
× |
|||
なし |
× |
× |
× |
||||
ref_pending=no |
あり |
あり |
× |
× |
× |
||
なし |
× |
× |
× |
||||
なし |
あり |
○ |
× |
× |
|||
なし |
× |
× |
× |
||||
リロード |
pending=no |
あり |
− |
× |
× |
× |
|
なし |
− |
× |
○ |
○ |
|||
ref_pending=no |
あり |
− |
× |
× |
× |
||
なし |
− |
○ |
× |
× |
|||
上記以外 |
− |
− |
− |
× |
× |
× |
|
USE以外 |
− |
− |
− |
− |
× |
× |
× |
- (凡例)
-
○:検査保留状態を設定します。
×:検査保留状態を変更しません(現在の状態を維持します)。
−:該当しません。
再編成又はリロード実行時の,検査制約の検査保留状態の設定範囲と参照制約の検査保留状態の設定範囲を次の表に示します。
実行単位 |
検査制約の検査保留状態の設定範囲 |
||
---|---|---|---|
ディクショナリ表 |
RDエリア中の表情報 |
||
SQL_TABLES表CHECK_PEND2列 |
SQL_CHECKS表CHECK_PEND2列 |
検査制約の状態 |
|
表 |
設定 |
設定 |
◎※ |
RDエリア |
設定 |
設定 |
○※ |
サーバ |
設定 |
設定 |
●※ |
- (凡例)
-
設定:検査保留状態を設定します。
◎:表を格納するすべてのRDエリア中の表情報(検査制約の状態)を設定します。
○:-rオプションで指定したRDエリア中の表情報(検査制約の状態)を設定します。
●:指定したすべてのunload文中のバックエンドサーバ内の表を格納する,すべてのRDエリア中の表情報(検査制約の状態)を設定します。
- 注※
-
インナレプリカ機能を使用している場合,次に示す世代が検査保留状態の設定対象になります。
-
-qオプションを指定している場合は,-qオプションで指定した世代が設定対象となります。
-
-qオプションを指定していない場合は,カレントRDエリアの世代が設定対象になります。
-
実行単位 |
対象表 |
|||||
---|---|---|---|---|---|---|
被参照表 |
参照表 |
|||||
被参照表に関連する参照表の検査保留状態 |
参照表の検査保留状態 |
|||||
ディクショナリ表 |
RDエリア中の表情報 |
ディクショナリ表 |
RDエリア中の表情報 |
|||
SQL_TABLES表CHECK_PEND列 |
SQL_REFERENTIAL_CONSTRAINTS表CHECK_PEND列 |
参照制約の状態 |
SQL_TABLES表CHECK_PEND列 |
SQL_REFERENTIAL_CONSTRAINTS表CHECK_PEND列 |
参照制約の状態 |
|
表 |
設定 |
設定 |
◎※ |
設定 |
設定 |
◎※ |
RDエリア |
設定 |
設定 |
◎※ |
設定 |
設定 |
○※ |
スキーマ |
設定 |
設定 |
◎※ |
設定 |
設定 |
◎※ |
サーバ |
設定 |
設定 |
◎※ |
設定 |
設定 |
●※ |
- (凡例)
-
設定:検査保留状態を設定します。
◎:表を格納するすべてのRDエリア中の表情報(検査制約の状態)を設定します。
○:-rオプションで指定したRDエリア中の表情報(検査制約の状態)を設定します。
●:指定したすべてのunload文内のバックエンドサーバ内の表を格納する,すべてのRDエリア中の表情報(検査制約の状態)を設定します。
- 注
-
UOCを使用する場合は検査保留状態を設定します。
- 注※
-
インナレプリカ機能を使用している場合,次に示す世代が検査保留状態の設定対象になります。
-
-qオプションを指定している場合は,-qオプションで指定した世代が設定対象となります。ただし,被参照表に対して再編成又はリロードをする場合,関係する参照表を格納するレプリカRDエリアが,-qオプションに指定した世代にないときは,カレントRDエリアの世代が設定対象となります。
-
-qオプションを指定していない場合は,カレントRDエリアの世代が設定対象になります。
-
(5) 検査保留状態の設定可否の例
次に示す表T1〜T5について,constraint文のpending及びref_pendingオペランドを指定した場合の,表の検査保留状態の設定可否について説明します。
- (表の説明)
-
T1:主キーを持つ表(T2に対する被参照表)
T2:T1の主キーを参照する外部キーを持ち,さらに自身が主キーを持つ表(T1への参照表であり,かつT3に対する被参照表である表)
T3:T2の主キーを参照する外部キーを持つ表(T2への参照表)
T4:検査制約を定義した表
T5:制約定義がない表
表T1〜T5に対してリロードを実行したときの表の検査保留状態を次の表に示します。
リロード対象表と制約定義有無 |
constraint文のオペランドの指定有無 |
表の検査保留状態 |
||||||||
---|---|---|---|---|---|---|---|---|---|---|
表名 |
参照制約 |
検査制約 |
pending |
ref_pending |
T1 |
T2 |
T3 |
T4 |
T5 |
|
被参照表 |
参照表 |
|||||||||
T1 |
○ |
× |
× |
なし |
なし |
− |
P |
− |
− |
− |
あり |
− |
N |
− |
− |
− |
|||||
あり |
なし |
− |
P |
− |
− |
− |
||||
あり |
− |
N |
− |
− |
− |
|||||
T2 |
○ |
○ |
× |
なし |
なし |
− |
P |
P |
− |
− |
あり |
− |
P |
N |
− |
− |
|||||
あり |
なし |
− |
N |
P |
− |
− |
||||
あり |
− |
N |
N |
− |
− |
|||||
T3 |
× |
○ |
× |
なし |
なし |
− |
− |
P |
− |
− |
あり |
− |
− |
P |
− |
− |
|||||
あり |
なし |
− |
− |
N |
− |
− |
||||
あり |
− |
− |
N |
− |
− |
|||||
T4 |
× |
× |
○ |
なし |
なし |
− |
− |
− |
P |
− |
あり |
− |
− |
− |
P |
− |
|||||
あり |
なし |
− |
− |
− |
N |
− |
||||
あり |
− |
− |
− |
N |
− |
|||||
T5 |
× |
× |
× |
なし |
なし |
− |
− |
− |
− |
− |
あり |
− |
− |
− |
− |
− |
|||||
あり |
なし |
− |
− |
− |
− |
− |
||||
あり |
− |
− |
− |
− |
− |
- (凡例)
-
P:検査保留状態を設定します。
N:検査保留状態を変更しません(現在の状態を維持します)。
−:該当しません(pending及びref_pendingオペランドの指定を無視します)。
○:定義あり。
×:定義なし。
(6) 検査保留状態を設定するタイミング
再編成又はリロードの対象となる表や,該当する表に関係する参照表には,再編成又はリロード処理を実行する前に,検査保留状態を設定します。なお,表の検査保留状態を設定した後,エラーの発生などによってpdrorgがロールバックした場合でも,表の検査保留状態の設定は完了(コミットが完了)しているため,表は検査保留状態となります。
スキーマ単位の場合は,再編成又はリロード処理を実行する前に,対象となるすべての表を一つずつ検査保留状態に設定します。そのため,表の検査保留状態の設定処理がエラーとなった場合,pdrorgはエラー終了するため,エラーになった表以前に処理した表は検査保留状態になりますが,エラーになった表より後の表は検査保留状態に変更されません。