SQL 解説書

例外表の作成規則

例外表を作成する際の規則は、次のとおりです。

  1. 例外表の最初の"n"列は、検査対象の表の列と同じです。 名前、タイプ、および長さなど、すべての列属性が同じでなければなりません。
  2. 例外表のすべての列は、制約やトリガーに束縛されないようにする必要があります。 制約には、参照保全、検査制約、さらには挿入時にエラーの原因となる固有索引の制約が含まれます。
  3. 例外表の第"(n+1)"列は、任意選択の TIMESTAMP 列です。 これは、 データを検査するための SET INTEGRITY を発行する前に例外表内の行が削除されなかった場合に、 同じ表の SET INTEGRITY ステートメントによる検査の連続呼び出しを検出するのに使用します。
  4. 第"(n+2)"列は、CLOB(32K) タイプまたはそれより大きいタイプでなければなりません。 この列は、行内のデータが違反している制約の名前を示すために使用されるもので、 任意選択ではありますが、なるべく使用するようにしてください。 この列を用意しなかった場合 (たとえば、 元の表の列数がすでに可能な最大値になっていた場合にはそれが可能)、 制約違反が検出された行だけがコピーされます。
  5. "(n+1)"列と"(n+2)"列の両方を備えた例外表を作成する必要があります。
  6. 上記の追加列の特定の名前には制約がありません。 しかし、タイプの指定は、正確でなければなりません。
  7. それ以外の列は使用できません。
  8. 元の表に DATALINK 列がある場合は、 例外表の対応する列に NO LINK CONTROL を指定する必要があります。 これを指定しておけば、 行 (DATALINK 列を持つ) が挿入されてもファイルにリンクされることはなく、 例外表から行が選択されてもアクセス・トークンは生成されません。
  9. 生成される列 (IDENTITY プロパティーも含む) が元の表にある場合は、 例外表の対応する列に、生成されるプロパティーを指定しないでください。
  10. また、SET INTEGRITY を呼び出してデータを検査するユーザーには、 例外表に対して INSERT 特権が必要です。

「メッセージ」列の情報は、以下の構造に従うものになります。

表 145. 例外表のメッセージ列の構造
フィールド番号 内容 サイズ コメント
1 制約違反の数 5 バイト 先頭に '0' を付加して右そろえ
2 最初の制約違反の種類 1 バイト
'K' - 検査制約違反
'F' - 外部キー違反
'G' - 生成される列違反
'I' - 固有索引違反a
'L' - DATALINK ロード違反

3 制約 / 列b/ 索引 IDc /DLVDESCd の長さ 5 バイト 先頭に '0' を付加して右そろえ
4 制約名 / 列名b/ 索引 IDc/DLVDESCd 直前のフィールドで指定される長さ
5 区切り記号 3 バイト <スペース><コロン><スペース>
6 次の制約違反の種類 1 バイト
'K' - 検査制約違反
'F' - 外部キー違反
'G' - 生成される列違反
'I' - 固有索引違反
'L' - DATALINK ロード違反

7 制約 / 列 / 索引 ID / DLVDESC の長さ 5 バイト 先頭に '0' を付加して右そろえ
8 制約名 / 列名 / 制約 ID/ DLVDESC 直前のフィールドで指定される長さ
..... ..... ..... 違反ごとにフィールド 5 〜 8 を繰り返す。
  • aSET INTEGRITY を使用した検査では固有索引違反は起こりません。 しかし、FOR EXCEPTION オプションを選択した場合に LOAD を実行すると、それが報告されます。 一方、LOAD は検査制約、生成される列、および外部キーに関する違反を例外表に報告しません。
  • b 生成される列の式をカタログ視点から取り出すには、 選択ステートメントを使用します。 たとえば、フィールド 4 が MYSCHEMA.MYTABLE.GEN_1 の場合、 SELECT SUBSTR(TEXT, 1, 50) FROM SYSCAT.COLUMNS WHERE TABSCHEMA='MYSCHEMA' AND TABNAME='MYNAME' AND COLNAME='GEN_1'; は、 式の最初の 50 文字を "AS (<expression>)" の形式で戻します。
  • c カタログ視点から索引 ID を取り出すには、 選択ステートメントを使用します。 たとえば、フィールド 4 が 1234 であれば、 SELECT INDSCHEMA, INDNAME FROM SYSCAT.INDEXES WHERE IID=1234 となります。
  • dDLVDESC は、 次の表で説明する DATALINK ロード違反記述子 (DATALINK Load Violation DESCriptor) です。


表 146. DATALINK ロード違反記述子 (DLVDESC)
フィールド番号 内容 サイズ コメント
1 違反している DATALINK 列の数 4 バイト 先頭に '0' を付加して右そろえ
2 最初に違反している列の DATALINK 列番号 4 バイト 先頭に '0' を付加して右そろえ
2 2 番目に違反している列のDATALINK 列番号 4 バイト 先頭に '0' を付加して右そろえ
..... ..... ..... 違反している列番号ごとに繰り返し
注:
  • DATALINK 列番号は、該当する表の SYSCAT.COLUMNS に示される COLNO です。


[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]