17.05 - エラー テーブルへのMERGEエラーの記録 - Advanced SQL Engine - Teradata Database

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

Product
Advanced SQL Engine
Teradata Database
Release Number
17.05
Release Date
2021年1月
Content Type
プログラミング リファレンス
Publication ID
B035-1146-175K-JPN
Language
日本語 (日本)
正常な場合、エラー ロギングが設定されたMERGEリクエストはUSIエラーまたはRIエラーなしで完了すると想定します。MERGEリクエストの正常な完了の例外は、次のように処理されます。
  • MERGEリクエストにLOGGING ERRORSオプションを指定した場合、すべての種類のエラーがログに記録されるわけではありません。
    • すべてのローカル、つまりデータ エラーはログに記録されます。

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

    • 行のマージ ステップの前にに発生したエラー、例えば、MRGまたはMRM AMPステップの前にRET AMPステップで検出されたデータ変換エラーは、ログに記録されません。
  • MERGE操作でUSIエラーかRIエラーのいずれか、またはその両方が発生した場合、次の事象が順番に発生します。
    1. トランザクションまたはリクエストを完了まで実行する。
    2. システムは、エラー テーブルにすべてのエラー行を書き込む。
    3. システムは、トランザクションまたはリクエストをアボートする。
    4. システムは、トランザクションまたはリクエストをロールバックする。

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

    リクエストで発生したエラーの数が多い場合、リクエストを完了まで実行しながら、すべてのINSERT操作とUPDATE操作をロールバックすると、パフォーマンスに影響を与える可能性があります。この問題の影響を最小限に抑えるには、WITH LIMIT OF error_limit句を指定するかについて必ず考える必要があります。

MERGEロードでエラー テーブルにエラーを記録する場合は、以下のルールと指針が適用されます。
  • MERGEロードでエラーをログに記録するためには、MERGEロードを行う場合のロード先となる基本データ テーブルのエラー テーブルを作成する必要があります。<Teradata Vantage™ - SQLデータ定義言語-構文規則および例、B035-1144>を参照してください。
  • エラー ロギングが無効な場合に、LOGGING ERRORSオプションを指定してMERGEロード操作の実行を依頼すると、システムはそのリクエストをアボートし、要求元にエラー メッセージを返します。
  • LOGGING ERRORSオプションは、ANSIとTeradataの両方のセッション モードで有効です。
  • LOGGING ERRORSオプションは、複文リクエストではないです。
  • LOGGING ERRORSオプションを指定した場合、次の2つの一般的なカテゴリのエラーをログに記録できます。
    • ローカル エラー

      ローカル エラーとは、データ行を挿入するのと同じAMPで発生するエラーのことです。次の種類のエラーは、ローカル エラーに分類されます。

      重複行エラー(ANSIセッション モードでのみ発生)

      システムは、Teradataセッション モードでMERGEからSETテーブルに発生した重複行エラーを無視します。

      重複行は、次のMERGE挿入の状況でも発生します。
      • ソース テーブルに重複行がある場合
      • 挿入が正しく実行されない場合。つまり、失敗した更新とは異なるAMPで挿入が実行された場合

      重複プライマリ キー エラー

      CHECK制約違反

      複数のソース テーブル行を使用して同じターゲット テーブルの行を更新しようとした場合

    • 非ローカル エラー
      非ローカル エラーとは、データ行を所有してないAMPで発生するエラーのことです。次の種類のエラーは、非ローカル エラーに分類されます。
      • 参照整合性違反
      • USI違反

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

      システムの応答はエラーの種類によって異なります。
      発生したエラーの種類 システムは、エラーをエラー テーブルに記録し、ターゲット テーブルからのエラーの原因となる行を拒否し、次の処理を行なう
      ローカル リクエストまたはトランザクションを正常に完了します。
      非ローカル MERGEロードにあるすべてのエラーの原因となる行を記録するために、リクエストまたはトランザクションを完了まで実行し、その後リクエストまたはトランザクションをアボートして、その挿入と更新をロールバックします。
      ローカルと非ローカル両方
  • データベースは、ローカル エラーを引き起こすターゲット テーブルのデータ行を拒否します。ただし、システムは、非ローカル エラーを引き起こすターゲット テーブルのデータ行を拒否せず、代わりにその行をターゲット テーブルに挿入します。
  • データベースは、MERGEエラー ロギングのバッチ参照整合性違反を処理しません。バッチ参照整合性チェックはオール オア ナッシング操作のため、バッチ参照整合性違反が発生するとシステムは、次のセッション モード固有の方法で応答します。
    有効になっているセッションのモード 結果
    ANSI リクエストをアボートしてロールバックします。
    Teradata トランザクションをアボートしてロールバックします。
  • データベースは、役に立つ回復情報をエラー テーブルに記録できないエラー条件を処理しません。このようなエラーは通常、入力データがターゲット テーブルに対応する行形式になる前の中間処理で発生します。

    データベースは、データ行の挿入と更新を開始する前にこの種類のエラーを検出します。次に、この種類のエラーの例を示します。

    • UDT、UDF、およびテーブル関数エラー
    • バージョン変更エラー
    • 存在しないテーブルのエラー
    • 非フォールバック テーブルに対する障害AMPリクエスト エラー
    • データ変換エラー

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

    次のテーブルに示すように、データベースがこれらのエラーを処理する方法は、現在のセッション モードによって異なります。
    有効になっているセッションのモード 結果
    ANSI リクエストをアボートしてロールバックします。
    Teradata トランザクションをアボートしてロールバックします。

データベースは、アボートしたリクエストまたはトランザクションによってログに記録されたエラー テーブルの行を保存し、リクエストまたはトランザクションをロールバックしません

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

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

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

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

  • 前述のエラーだけでなく、データベースは、次の種類のエラーも処理しません。ただし、これらのエラーについてログに記録した行は保存します。
    • 固定領域不足エラーまたはスプール領域不足エラー
    • Teradataセッション モードでの重複行エラー(Teradataセッション モードでは、このエラーは無視されるため)
    • トリガー エラー
    • 結合インデックス保守エラー
    • 識別列エラー
    • 暗黙的USI違反

      プライマリ インデックスではないプライマリ キーでテーブルを作成した場合、データベースは暗黙的にそのプライマリ キーにUSIを定義します。

      データベースは、プライマリ キーに定義された違反した暗黙的USIを削除してからUSIを再作成することができないため、その違反USIを無効にできません。

      データベースは、次のセッション モード固有の方法でエラーを処理します。

      有効になっているセッションのモード 結果
      ANSI リクエストをアボートしてロールバックします。
      Teradata トランザクションをアボートしてロールバックします。
  • LOGGING ERRORSオプションをMERGEロード リクエストに適用できるのは、そのターゲット テーブルが永久データ テーブルの場合だけです。

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

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

  • 不適切な更新操作または挿入操作を指定するMERGEリクエストに対するエラーをログに記録できません。
    この場合、エラーのあるMERGEリクエストを含んでいるリクエストまたはトランザクションは、不適切なINSERT指定の検出時に次のように動作します。
    有効になっているセッションのモード 結果
    ANSI リクエストをアボートしてロールバックします。
    Teradata トランザクションをアボートしてロールバックします。
  • すべてのエラーをログに記録するか、またはエラーをログに記録しないことが可能です。ログに記録するエラーの種類は指定できません。WITH LIMIT OF error_limitオプションを使用すると、ログに記録されたエラーの数がオプションのWITH LIMIT OF error_limit句で指定した数に到達したときにエラー ロギングを終了できます。

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

    この場合、エラーのあるMERGEリクエストを含んでいるリクエストまたはトランザクションは、エラー発生時に次のように動作します。
    有効になっているセッションのモード 結果
    ANSI リクエストをアボートしてロールバックします。
    Teradata トランザクションをアボートしてロールバックします。
  • WITH NO LIMITオプションもWITH LIMIT OF error_limitオプションも指定しない場合、エラー制限値のデフォルト値は10です。
    データベースは、10個までエラーをログに記録します。11個目のエラーが発生したとき、MERGEリクエストを含んでいるリクエストまたはトランザクションは次のように動作します。
    有効になっているセッションのモード 結果
    ANSI リクエストをアボートしてロールバックします。
    Teradata トランザクションをアボートしてロールバックします。
データベースは、アボートしたリクエストまたはトランザクションによってログに記録されたエラー テーブルの行を保存し、リクエストまたはトランザクションをロールバックしません
  • WITH NO LIMIT

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

  • WITH LIMIT OF error_limit
    データベースは、error_limitの制限値までエラーをログに記録します。error_limit + 1個目のエラーが発生したとき、MERGEリクエストを含んでいるリクエストまたはトランザクションは次のように動作します。
    有効になっているセッションのモード 結果
    ANSI リクエストをアボートしてロールバックします。
    Teradata トランザクションをアボートしてロールバックします。
データベースは、アボートしたリクエストまたはトランザクションによってログに記録されたエラー テーブルの行を保存し、リクエストまたはトランザクションをロールバックしません
  • MERGE ... LOGGING ERRORSリクエストに対して返されるアクティビティ カウントは、LOGGING ERRORSオプションが指定されていないMERGE操作に対して返されるアクティビティ カウントと同じであり、ターゲット データ テーブルの以下が実行された行の合計数です。
    • 更新
    • 挿入
    • 削除
      DELETEはINSERTまたはUPDATEと一緒に使用できません。INSERTおよびUPDATEは個別に、または一緒に使用できます。
      アプリケーションに返される可能性のあるアクティビティ タイプを次のテーブルに示します。
      アクティビティ タイプ名 アクティビティ タイプ番号 説明
      PCLMRGMIXEDSTMT 127 更新と挿入の混合
      PCLMRGUPDSTMT 128 すべて更新で、挿入または削除はなし
      PCLMRGINSSTMT 129 すべて挿入で、更新または削除はなし
      PCLMRGDELSTMT 206 すべて削除で、更新または挿入はなし
動的なMERGEリクエストは、次のアクティビティ タイプを返します。
返されるアクティビティ タイプ MERGEリクエストに指定されている句
PCLMRGMIXEDSTMT WHEN MATCHED および WHEN NOT MATCHED.
  • MERGEリクエストがターゲット テーブルの行の更新のみを行なう場合、データベースはアクティビティ タイプをPCLMRGUPDSTMTに内部変換します。
  • MERGEリクエストがターゲット テーブルへの行の挿入のみを行なう場合、データベースはアクティビティ タイプをPCLMRGINSSTMTに内部変換します。
PCLMRGUPDSTMT WHEN MATCHED THEN UPDATEのみ
PCLMRGINSSTMT WHEN NOT MATCHED THEN INSERTのみ
PCLMRGDELSTMT WHEN MATCHED THEN DELETEのみ

次に、MERGE文と結果の出力の例を示します。

MERGE INTO t1 target
   USING (SEL a, b, c FROM src WHERE a <= 100) AS source (a, b, c)
   ON target.a1 = source.a
      WHEN MATCHED UPDATE SET b1=b1+100
      WHEN NOT MATCHED THEN INSERT (a,b,c);
*** Merge completed. 80 rows affected.
   30 rows inserted, 50 rows updated, no rows deleted.

アクティビティ タイプの詳細は、<Teradata® CLI V2メインフレーム接続システム、B035-2417>または<Teradata® CLI V2ワークステーション接続システム、B035-2418>を参照してください。

  • LOGGING ERRORSはLOBデータをサポートしません。ソース表のLOBは、エラー テーブルにコピーされません。LOBは、エラー テーブルではnullとして表わされます。
  • インデックス違反エラーによって、関連するインデックスが無効になることはありません。
  • 参照整合性違反エラーの場合、RI_Child_TablesVXビューでIndexId値を使用して、違反した参照インデックスを識別できます(RI_Child_TablesVXビューの詳細は<Teradata Vantage™ - データ ディクショナリ、B035-1092>を参照、参照インデックスの詳細は、<Teradata Vantage™ - データベースの設計、B035-1094>を参照)。エラー テーブルのETC_IdxErrType列に格納されているコードによって、インデックス エラーがUSIエラーであるか参照整合性エラーであるかを判断できます。
ETC_IdxErrTypeの値 エラーの種類
R 外部キー挿入違反
r 親キー削除違反
U USI違反エラー