5.4.14 constraint文(検査保留状態に関する記述)
検査保留状態に関する設定をします。
検査制約又は参照制約を定義した表にデータロードする場合,pdloadではデータの整合性チェックをしないため,制約の整合性が保証できないデータを格納する可能性があります。このとき,pdconstckで整合性を検証するまで,表へのデータ操作を制限させるため,データロード対象表やその表に関係する参照表を検査保留状態に設定します。
なお,ユーザ自身が制御文を指定して,表の検査保留状態を変更しないこともできます。検査保留状態については,マニュアル「HiRDB システム導入・設計ガイド」を参照してください。
- <適用基準>
-
次のどちらかに該当する場合,constraint文を指定します。
-
検査制約又は参照制約を定義した表にデータロードする場合,その表の検査保留状態を変更(設定)しないとき
-
被参照表にデータロードする場合,その表に関係する参照表の検査保留状態を変更(設定)しないとき
-
- <規則>
-
-
この制御文は,システム定義のpd_check_pendingオペランドの値がUSEの場合だけ有効となります。次のどれかに該当する場合,constraint文の指定は無視され,表の検査保留状態を変更しません。
・システム定義のpd_check_pendingオペランドの値がNOUSEの場合
・表に制約が定義されていない場合
・分割入力データファイルを作成する場合(src_work文を指定する場合)
-
(1) 形式
constraint 〔pending=no〕 〔ref_pending=no〕
(2) 説明
(a) pending=no
参照表又は検査制約表にデータロードする場合,その表の検査保留状態を変更しないときに指定します。このオペランドを省略した場合の仮定値は,「検査保留状態の設定範囲」を参照してください。
- <適用基準>
-
次のどちらかに該当する場合,pending=noを指定します。
-
参照表又は検査制約を定義した表にデータロードする場合,列に格納するデータがユーザによる事前チェックによって整合性が保たれている保証があるとき
-
参照表又は検査制約を定義した表に対して,インデクスの再作成をするためにデータ件数0件でデータロードをする場合
-
(b) ref_pending=no
被参照表にデータロードする場合,その表に関係する参照表の検査保留状態を変更しないときに指定します。このオペランドを省略した場合の仮定値は,「検査保留状態の設定範囲」を参照してください。
- <適用基準>
-
次のどちらかに該当する場合,ref_pending=noを指定します。
-
被参照表に対して作成モードでデータロードする場合,被参照表のデータと参照表のデータがユーザの事前チェックによって整合性が保たれている保証があるとき
-
被参照表に対して,インデクスの再作成をするために追加モードでデータ件数0件のデータロードをする場合
-
(3) 注意事項
-
被参照表へデータロードする場合,その表に関係する参照表を検査保留状態に設定するときの注意事項については,「コマンド実行時のRDエリアの状態」を参照してください。
-
検査保留状態を設定する場合,関連する資源に対して排他が掛かります。また,検査保留状態の設定が完了したとき,掛かっていた排他が解除されます。排他制御については,「コマンド実行時の排他制御モード」を参照してください。
(4) 検査保留状態の設定範囲
検査制約の検査保留状態の設定範囲と参照制約の検査保留状態の設定範囲を次の表に示します。
データロード実行条件 |
検査制約の検査保留状態 |
|||
---|---|---|---|---|
システム定義のpd_check_pendingオペランドの値 |
実行単位 |
ディクショナリ表 |
RDエリア中の表情報 |
|
SQL_TABLES表CHECK_PEND2列 |
SQL_CHECKS表CHECK_PEND2列 |
検査制約の状態 |
||
USE |
表 |
● |
● |
◎ |
RDエリア |
● |
● |
○ |
|
NOUSE |
表 |
× |
× |
× |
RDエリア |
× |
× |
× |
- (凡例)
-
◎:表を格納するすべてのRDエリア中の表情報(検査制約の状態)を設定します。
●:検査保留状態を設定します。
○:データロード対象のRDエリア中の表情報(検査制約の状態)を設定します。
×:検査保留状態を変更しません(現在の状態を維持します)。
データロード実行条件 |
データロード対象表 |
|||||||
---|---|---|---|---|---|---|---|---|
システム定義のpd_check_pendingオペランドの値 |
-dオプションの指定 |
実行単位 |
被参照表 |
参照表 |
||||
被参照表に関連する参照表の検査保留状態 |
参照表の検査保留状態 |
|||||||
ディクショナリ表 |
RDエリア中の表情報 |
ディクショナリ表 |
RDエリア中の表情報 |
|||||
SQL_TABLES表CHECK_PEND列 |
SQL_REFERENTIAL_CONSTRAINTS表CHECK_PEND列 |
参照制約の状態 |
SQL_TABLES表CHECK_PEND列 |
SQL_REFERENTIAL_CONSTRAINTS表CHECK_PEND列 |
参照制約の状態 |
|||
USE |
あり |
表 |
● |
● |
◎ |
● |
● |
◎ |
RDエリア |
● |
● |
◎ |
● |
● |
○ |
||
なし |
表 |
× |
× |
× |
● |
● |
◎ |
|
RDエリア |
× |
× |
× |
● |
● |
○ |
||
NOUSE |
あり |
表 |
× |
× |
× |
× |
× |
× |
RDエリア |
× |
× |
× |
× |
× |
× |
||
なし |
表 |
× |
× |
× |
× |
× |
× |
|
RDエリア |
× |
× |
× |
× |
× |
× |
- (凡例)
-
◎:表を格納するすべてのRDエリア中の表情報(検査制約の状態)を設定します。
●:検査保留状態を設定します。
○:データロード対象の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) 検査保留状態を設定するタイミング
データロード対象表やその表に関係する参照表の検査保留状態を設定するタイミングは,データロードのモードによって異なります。データロードのモードと検査保留状態に設定するタイミングの関係を次の表に示します。
データロードのモード |
検査保留状態を設定するタイミング |
---|---|
作成モード |
データ削除処理を開始する前 |
追加モード |
データロードを開始する前 |
なお,表の検査保留状態を設定した後,エラーの発生などによってpdloadがロールバックした場合でも,表の検査保留状態の設定は完了(コミットが完了)しているため,表は検査保留状態となります。