17.10 - INSERT ... SELECTリクエストのエラーの記録 - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQLデータ操作言語

Product
Advanced SQL Engine
Teradata Database
Release Number
17.10
Release Date
2021年7月
Content Type
プログラミング リファレンス
Publication ID
B035-1146-171K-JPN
Language
日本語 (日本)
通常、エラー ロギングが設定されたINSERT ... SELECTリクエストは、USIエラーまたはRIエラーなしで完了します。INSERT ... SELECTリクエストの正常な完了の例外は、次のように処理されます。
  • INSERT ... SELECTリクエストにLOGGING ERRORSオプションを指定した場合、すべての種類のエラーがログに記録されるわけではありません。
    • すべてのローカル、つまりデータ エラーはログに記録されます。
    • 行のマージ ステップの前に発生したエラー、たとえば、MRGまたはMRM AMPステップの前にRET AMPステップで検出されたデータ変換エラーは、ログに記録されません。<Teradata Vantage™ - SQLリクエストおよびトランザクション処理、B035-1142>を参照してください。

      行のマージ ステップ処理中には、CHECK制約エラー、重複行エラー、UPI違反エラーなどのエラーが発生します。

  • データベースがUSIエラーかRIエラーのいずれか(または、両方)を検出すると、INSERT ... SELECT操作は、次に示す事象が順番に発生します。
    1. トランザクションまたはリクエストを完了まで実行する。
    2. システムは、エラー テーブルにエラーの原因となる行をすべて書き込む。
    3. システムは、トランザクションまたはリクエストをアボートする。
    4. システムは、トランザクションまたはリクエストをロールバックする。

      システムは、インデックスを無効にしたり、エラー テーブルの行をロールバックしたりしません。システムは、ユーザーがINSERTセットのどの行に問題があるかを特定し、その問題を修正する方法を決定できるようにします。

    リクエストで発生したエラーの数が多い場合、リクエストを完了まで実行しながら、すべてのINSERT操作をロールバックすると、パフォーマンスに影響を与える可能性があります。この問題の影響を最小限に抑えるには、デフォルトの制限値を使用するか、それともerror_limitに比較的小さい値を使用してWITH LIMIT OF error_limit句を指定するかについて必ず考える必要があります。つまり、適切な理由がない限り、WITH NO LIMITを指定しないでください。

  • INSERT ... SELECT操作でデータ エラーだけが発生した場合、そのエラー発生によってトランザクションまたはリクエストはアボートされません。エラーのないINSERT操作は正常に完了し、エラー行は訂正できるようにエラー テーブルに記録されます。
INSERT ... SELECTロードでエラー テーブルにエラーを記録する場合は、以下のルールと指針が適用されます。
  • INSERT ... SELECTロードでエラーをログに記録するためには、最初にINSERT ... SELECTロードを実行する基本データ テーブルのエラー テーブルを作成する必要があります。Teradata Vantage™ - SQLデータ定義言語-構文規則および例、B035-1144を参照してください。
  • エラー ロギングが無効な場合に、LOGGING ERRORSオプションを指定してINSERT ... SELECTバルクロード操作の実行を依頼すると、システムはそのリクエストをアボートし、要求元にエラー メッセージを返します。
  • LOGGING ERRORSオプションは、複数文リクエストでは無効です。
  • LOGGING ERRORSオプションを指定した場合、次の2つの基本タイプのエラーをログに記録できます。
    • ローカル エラー
      ローカル エラーとは、データ行を挿入するのと同じAMPで発生するエラーのことです。次の種類のエラーは、ローカル エラーに分類されます。
      • 重複行エラー(ANSIセッション モードでのみ発生)

        システムは、Teradataセッション モードでINSERT ... SELECTによるSETテーブルへの挿入で発生した重複行エラーを無視します。

        重複行は、以下のINSERT ... SELECT挿入の状況でも発生します。
        • ソース テーブルに重複行がある場合
        • 失敗した更新とは異なるAMPで挿入が実行された場合
      • 重複プライマリ キー エラー
      • CHECK制約違反
    • 非ローカル エラー
      非ローカル エラーとは、データ行を所有していないAMPで発生するエラーのことです。次の種類のエラーは、非ローカル エラーに分類されます。
      • 参照整合性違反
      • USI違反

        この例外は、USIが行パーティション テーブルのプライマリ インデックスと同じ列セットに存在するのでUSI違反がローカルであるという場合です。厳密に言えばそのエラーはローカル エラーですが、システムは、非ローカル エラーとして処理します。

    システムは、エラー テーブルのエラーを記録し、エラーの原因となった行をターゲット テーブルから拒否し、エラーの種類に応じて次の表で説明する操作を実行します。

    エラーの種類 応答
    ローカル リクエストまたはトランザクションを正常に完了します。
    非ローカル INSERT ... SELECTロードにあるすべてのエラーの原因となる行を記録するために、リクエストまたはトランザクションを完了まで実行し、その後リクエストまたはトランザクションをアボートして、その挿入と更新をロールバックします。
    ローカルと非ローカル
  • システムは、INSERT ... SELECTエラー ロギングのバッチ参照整合性違反を処理しません。バッチ参照整合性チェックはオール オア ナッシング操作のため、バッチ参照整合性違反が発生するとシステムは、次のセッション モード固有の方法で応答します。
    セッション モード Result
    ANSI リクエストをアボートしてロールバックします。
    Teradata トランザクションをアボートしてロールバックします。
  • システムは、役に立つ回復情報をエラー テーブルに記録できないエラー条件を処理しません。このようなエラーは通常、入力データがターゲット テーブルに対応する行形式になる前の中間処理で発生します。
    システムは、データ行の挿入と更新を開始する前にこの種類のエラーを検出します。次に、この種類のエラーの例を示します。
    • UDT、UDF、およびテーブル関数エラー
    • バージョン変更エラー
    • 存在しないテーブルのエラー
    • 非フォールバック テーブルに対する障害AMPリクエスト エラー
    • データ変換エラー

      行の挿入中に発生した変換エラーは、ローカル データ エラーとして処理されます。

    これらのエラーの処理方法は、現在のセッション モードによって異なります。

セッション モード Result
ANSI リクエストをアボートしてロールバックします。
Teradata トランザクションをアボートしてロールバックします。

システムは、アボートしたリクエストまたはトランザクションによってログに記録されたエラー テーブルの行を保存し、リクエストまたはトランザクションのロールバックを行なうことはありません。

システムは、エラーをログに記録して正常に完了したINSERT ... SELECTリクエストの最後に、マーカー行をエラー テーブルに挿入します。

マーカー行には、エラー テーブルのETC_ErrorCode列に値0があり、ETC_ErrSeq列には、ログに記録されたエラーの合計数が格納されます。マーカー行のETC_DBQL_QIDとETC_TimeStampを除く他のすべての列は、nullに設定されます。

マーカー行が記録されていない場合、リクエストまたはトランザクションはアボートされ、ロールバックされています。次の1つ以上の理由が当てはまります。
  • 指定されたエラー制限値に到達した。
  • システムが処理できないエラーを検出した。
  • システムが非ローカル(RIまたはUSI)違反を検出した。

    データベースは、アボートしたリクエストまたはトランザクションに属するエラー行を保存します。

  • 前述のエラーだけでなく、システムは、次の種類のエラーも処理しません。ただし、次に示すエラーが検出された場合、システムはログに記録したエラー テーブルの行を保存します。
    • 固定領域不足エラーまたはスプール領域不足エラー
    • Teradataセッション モードでの重複行エラー(Teradataセッション モードでは、このエラーは無視されるため)
    • トリガー エラー
    • 結合インデックス保守エラー
    • 識別列エラー
  • LOGGING ERRORSオプションをINSERT ... SELECTロードリクエストに適用できるのは、そのターゲット テーブルが永久データ テーブルの場合だけです。

    揮発テーブル、グローバル一時テーブルなどの他の種類のターゲット テーブルはサポートされません。

    データベースは、エラーをログに記録すると、要求元に警告メッセージを返します。

  • すべてのエラーをログに記録する、またはエラーをログに記録しないことを指定できます。つまり、ログに記録するエラーの種類は指定できません。WITH LIMIT OF error_limitオプションを使用すると、ログに記録されたエラーの数がオプションのWITH LIMIT OF error_limit句で指定した数に到達したときにエラー ロギングを終了できます。

    LOGGING ERRORSオプションを指定せず、INSERT SELECTリクエストのターゲット データ テーブルにエラー テーブルが定義されている場合、システムは、そのデータ テーブルに対するINSERT ... SELECT操作で発生したエラーを処理しません。

    この場合、エラーのあるINSERT ... SELECTリクエストを含んでいるリクエストまたはトランザクションは、エラー発生時に次のように動作します。

    セッション モード Result
    ANSI リクエストをアボートしてロールバックします。
    Teradata トランザクションをアボートしてロールバックします。
  • WITH NO LIMITオプションもWITH LIMIT OF error_limitオプションも指定しない場合、エラー制限値のデフォルト値は10です。

    データベースは、10個までエラーをログに記録します。10個目のエラーが発生したとき、INSERT ... SELECTリクエストを含んでいるリクエストまたはトランザクションは次のように動作します。

    セッション モード Result
    ANSI リクエストをアボートしてロールバックします。
    Teradata トランザクションをアボートしてロールバックします。
データベースは、アボートされたリクエストまたはトランザクションによって記録されたすべてのエラー テーブルの行を保持し、ロールバックを行なうことはありません。
  • WITH NO LIMIT

    データベースは、INSERT ... SELECT操作のターゲット データ テーブルに関連付けられているエラー テーブルに保存できるエラー行数を制限しません。

  • WITH LIMIT OF error_limit

    データベースは、error_limitの制限値までエラーをログに記録します。error_limitに到達すると、INSERT ... SELECTリクエストを含んでいるリクエストまたはトランザクションは次のように動作します。

セッション モード Result
ANSI リクエストをアボートしてロールバックします。
Teradata トランザクションをアボートしてロールバックします。
データベースは、アボートされたリクエストまたはトランザクションによって記録されたすべてのエラー テーブルの行を保持し、ロールバックを行なうことはありません。
  • INSERT ... SELECT LOGGING ERRORSリクエストに対して返されるアクティビティ カウントは、LOGGING ERRORSオプションが指定されていないINSERT ... SELECT操作に対して返されるアクティビティ カウントと同じです。ターゲット データ テーブルに挿入された行の合計数が返されます。
  • LOGGING ERRORSはLOBデータをサポートしません。ソース テーブルのLOBは、エラー テーブルにコピーされません。LOBは、エラー テーブルではnullとして表わされます。
  • インデックス違反エラーによって、関連するインデックスが無効になることはありません。
  • 参照整合性検証エラーの場合、RI_Child_TablesVXビューでIndexId値を使用して、違反した参照インデックスを識別できます。参照インデックスの詳細は、<Database Design>を参照してください。

    ETC_IdxErrTypeエラー テーブルの列に格納されているコードによって、インデックス エラーがUSIエラーであるか参照整合性エラーであるかを判断できます。

ETC_IdxErrType値 エラー
R 外部キー挿入違反
r 親キー削除違反
U USI違反エラー