11.20.2 検査制約の定義
検査制約は,定義系SQLのCREATE TABLEでCHECKを指定し,表の値の制約条件を探索条件で指定します。また,検査保留状態を使用するには,pd_check_pendingオペランドにUSEを指定するか,又はオペランドの指定を省略します。
- 〈この項の構成〉
(1) 検査制約を定義する表の制限事項
検査制約を定義する表の表定義,及び表定義変更時の制限事項を次に示します。
(a) 表定義(CREATE TABLE)時
-
検査制約は改竄防止表には定義できません。
-
検査制約は一つの表に254個まで定義できます。255個以上は定義できません。例を次に示します。
この場合,検査制約数が254個より多いため,定義できません。表定義時にエラーとなります。
-
検査制約,及び各検査制約の探索条件中のAND,ORの個数の和は一つの表に254個まで定義できます(ただし,CASE式中の探索条件,及びその探索条件中のAND,ORの個数は除きます)。例を次に示します。
この場合,検査制約数は2個ですが,制約名CHECK_T1_C1の探索条件中のANDの数が200,制約名CHECK_T1_C2の探索条件中のANDの数53で,検査制約数と各検査制約の探索条件中のAND,ORの和が255(2+200+53)となり,254個より多いため定義できません。表定義時にエラーとなります。
なお,表に定義されている検査制約数と各検査制約の探索条件中のAND,ORの和はディクショナリ表のSQL_TABLE表の,N_CHECK_LIMIT列に格納されています。
(b) 表定義変更(ALTER TABLE)時
-
検査制約表に対して,DROP句及びRENAME句を使用した表定義変更はできません。
-
検査制約表に対して,CHANGE句を使用した次の変更はできません。
-
データ型やデータ長の変更
-
SPLITの変更
-
既定値の設定,解除
-
WITH DEFAULTの設定
-
-
検査制約表に対して,RENAME句を使用した列名変更はできません。
(2) 検査制約を定義する場合の注意事項
-
SQLオブジェクト用バッファ長の容量見積もり
検査制約表に対して操作する場合,HiRDBが制約条件をチェックするトリガを生成します。そのため,SQLオブジェクト用バッファを指定するときにHiRDBが生成する制約条件のSQLオブジェクトについても考慮する必要があります。SQLオブジェクト用バッファ長(pd_sql_object_cache_size)の見積もり式については,マニュアル「HiRDB システム定義」を参照してください。
-
バックアップの取得
バックアップ取得時点の検査保留状態によって,バックアップの取得範囲が異なります。バックアップの取得時点と取得範囲については,マニュアル「HiRDB システム運用ガイド」の「同時にバックアップを取得する必要があるRDエリア」を参照してください。
-
データディクショナリ用RDエリアの再編成
検査制約表の定義と削除を繰り返すと,データディクショナリ用RDエリアの格納効率が低下します。このような場合,データベース状態解析ユティリティ(pddbst)でデータディクショナリ用RDエリアの格納効率を確認し,必要に応じて再編成してください。