

# エスケープハッチ処理時の Babelfish のエラー処理の管理
<a name="babelfish-strict"></a>

Babelfish は可能な限り、制御フローとトランザクションの状態から SQL の動作を模倣します。Babelfish でエラーが発生するとSQL Server エラーコードに似たエラーコードを返します。Babelfish がエラーを SQL Server のコードにマッピングできない場合、修正されたエラーコード (`33557097`) が返され、エラーの種類に基づいて特定のアクションを実行します。
+ コンパイル時エラーの場合、Babelfish はトランザクションをロールバックします。
+ ランタイム時エラーの場合、Babelfish はバッチを終了し、トランザクションをロールバックします。
+ クライアントとサーバー間のプロトコルエラーの場合、トランザクションはロールバックされません。

エラーコードを同等のコードにマッピングできず、同様のエラーのコードが使用可能な場合、エラーコードは代替コードにマッピングされます。例えば、SQL Server コード `8143` や `8144` の原因となる動作などは、両方とも `8143` にマップされます。

マッピングできないエラーは、`TRY... CATCH` 構成を配慮しません。

`@@ERROR` を使って SQL Server のエラーコードを返すか、`@@PGERROR` 関数 を使って PostgreSQL エラーコードを返すことができます。また `fn_mapped_system_error_list` 関数を使用して、マッピングされたエラーコードのリストを返しますことも可能です。PostgreSQL のエラーコードについては、「[PostgreSQL ウェブサイト](https://www.postgresql.org/docs/current/errcodes-appendix.html)」を参照してください。

## Babelfish エスケープのハッチ設定を変更する
<a name="babelfish-escape_hatches"></a>

失敗する可能性のあるステートメントを処理するために、Babelfish はエスケープハッチと呼ばれる特定のオプションを定義しています。*エスケープハッチング*は、サポートされていない特徴や構文に遭遇した際に、 Babelfish の動作を指定するオプションです。

`sp_babelfish_configure` ストアドプロシージャを使用して、エスケープハッチングの設定を制御することができます。スクリプトを使用して、エスケープハッチングを `ignore` または `strict` に設定します。`strict` に設定されている場合、Babelfish は修正する必要のあるエラーを続行する前に返します。

現在のセッションおよびクラスターレベルに変更を適用するには、`server` キーワードを含めます。

使用方法は次のようになります:
+ エスケープハッチングとそのステータス、および使用状況をすべて一覧表示するには、`sp_babelfish_configure` を実行します。
+ 現在のセッションまたはクラスター全体の名前付きエスケープハッチングとその値を一覧表示するには、`{{hatch_name}}` が 1 つ以上のエスケープハッチングの識別子になっている `sp_babelfish_configure '{{hatch_name}}'` コマンドを実行します。{{hatch\_name}} は「%」などの SQL ワイルドカードを使用できます。
+ 1 つまたは複数のエスケープハッチングを指定した値に設定するには、`sp_babelfish_configure ['{{hatch_name}}' [, 'strict'|'ignore' [, 'server']]` を実行します。クラスター全体のレベルで設定を永続化するには、次に示されているように、`server` キーワードを含めます。

  ```
  EXECUTE sp_babelfish_configure 'escape_hatch_unique_constraint', 'ignore', 'server'
  ```

  現在のセッションに対してのみ設定する場合、`server` は使用しないでください。
+ すべてのエスケープハッチをデフォルト値にリセットするには、`sp_babelfish_configure 'default'` を実行します (Babelfish 1.2.0 以上)。

ハッチ (または複数のハッチ) を識別する文字列に SQL ワイルドカードが含まれている場合があります。例えば以下では、すべての構文エスケープハッチングを Aurora PostgreSQL クラスターの `ignore` に設定しています。

```
EXECUTE sp_babelfish_configure '%', 'ignore', 'server'
```

次の表に、Babelfish の定義済みエスケープハッチの説明とデフォルト値を示します。


| エスケープハッチ | 説明 | デフォルト値 | 
| --- | --- | --- | 
| escape\_hatch\_checkpoint | 手続き型コードで CHECKPOINT ステートメントを使用できますが、CHECKPOINT ステートメントは現在実装されていません。 | ignore | 
| escape\_hatch\_constraint\_name\_for\_default | デフォルトの制約名に関連する Babelfish の動作を制御します。 | ignore | 
| escape\_hatch\_database\_misc\_options | CREATE DATABASE の以下のオプションに関連した Babelfish 動作を管理します: CONTAINMENT、DB\_CHAINING、TRUSTWORTHY、PERSISTENT\_LOG\_BUFFER。 | ignore | 
| escape\_hatch\_for\_replication | テーブルを作成または変更する際、 [NOT] FOR REPLICATION 句に関連する Babelfish の動作を制御します。 | strict | 
| escape\_hatch\_fulltext | CREATE/ALTER DATABASE の DEFAULT\_FULLTEXT\_LANGUAGE や CREATE FULLTEXT INDEX、 また sp\_fulltext\_database などの FULLTEXT 機能に関連する Babelfish の動作を制御します。 | ignore | 
| escape\_hatch\_ignore\_dup\_key | CREATE/ALTER TABLE および CREATE INDEX に関する Babelfish の動作を制御します。IGNORE\_DUP\_KEY=ON の場合、`strict` (デフォルト) に設定するとエラーが発生し、`ignore` に設定するとエラーを無視します (Babelfish バージョン 1.2.0 以上)。 | strict | 
| escape\_hatch\_index\_clustering | インデックス、プライマリキー、または UNIQUE 制約のクラスタ化キーワードまたは非クラスタ化キーワードに関連する Babelfish の動作を制御します。CLUSTERED が無視された場合も、インデックスまたは制約は NONCLUSTERED が指定されているかのように作成されます。 | ignore | 
| escape\_hatch\_index\_columnstore | COLUMNSTORE 句に関連する Babelfish の動作を制御します。`ignore` を指定した場合、Babelfish は通常の B-tree インデックスを作成します。 | strict | 
| escape\_hatch\_join\_hints | JOIN 演算子のキーワードの動作を制御します: LOOP、HASH、MERGE、REMOTE、REDUCE、REDISTRIBUTE、REPLICATE。 | ignore | 
| escape\_hatch\_language\_non\_english | 画面上のメッセージの英語以外の言語に関する Babelfish の動作を制御します。Babelfish は現在 画面上のメッセージのみで `us_english` をサポートされます。SET LANGUAGE は言語名を含む可変を使用する場合があるため、設定されている実際の言語はランタイムでのみ検出できます。 | strict | 
| escape\_hatch\_login\_hashed\_password | 無視された場合は、`CREATE LOGIN` と`ALTER LOGIN` の `HASHED` キーワードに対するエラーが抑制されます。 | strict | 
| escape\_hatch\_login\_misc\_options | 無視された場合は、`HASHED`、`MUST_CHANGE`、`OLD_PASSWORD`、および `UNLOCK` 以外の他のキーワード、そして `CREATE LOGIN` と `ALTER LOGIN` に対するエラーが抑制されます。 | strict | 
| escape\_hatch\_login\_old\_password | 無視された場合は、`CREATE LOGIN` と`ALTER LOGIN` の `OLD_PASSWORD` キーワードに対するエラーが抑制されます。 | strict | 
| escape\_hatch\_login\_password\_must\_change | 無視された場合は、`CREATE LOGIN` と`ALTER LOGIN` の `MUST_CHANGE` キーワードに対するエラーが抑制されます。 | strict | 
| escape\_hatch\_login\_password\_unlock | 無視された場合は、`CREATE LOGIN` と`ALTER LOGIN` の `UNLOCK` キーワードに対するエラーが抑制されます。 | strict | 
| escape\_hatch\_nocheck\_add\_constraint | 制約の WITH CHECK 句または NOCHECK 句に関連する Babelfish の動作を制御します。 | strict | 
| escape\_hatch\_nocheck\_existing\_constraint | FOREIGN KEY および CHECK 制約に関連する Babelfish の動作を制御します。 | strict | 
| escape\_hatch\_query\_hints | クエリヒントに関連する Babelfish の動作を制御します。このオプションが 無視するよう設されていると、サーバーは OPTION (...) 句を使用してクエリ処理の側面を指定するヒントを無視します。例に含まれるのは SELECT FROM… OPTION(MERGE JOIN HASH, MAXRECURSION 10)) | ignore | 
|  escape\_hatch\_rowversion | ROWVERSION および TIMESTAMP のデータ型の動作を制御します。使用に関する情報については、「[実装が制限されている機能](babelfish-compatibility.tsql.limited-implementation.md)」を参照してください。 | strict | 
| escape\_hatch\_schemabinding\_function | WITH SCHEMABINDING 句に関連する Babelfish の動作を制御します。デフォルトでは、CREATE または ALTER FUNCTION コマンドで指定した場合は、WITH SCHEMABINDING 句は無視されます。 | ignore | 
| escape\_hatch\_schemabinding\_procedure | WITH SCHEMABINDING 句に関連する Babelfish の動作を制御します。デフォルトでは、CREATE または ALTER PROCEDURE コマンドで指定した場合は、WITH SCHEMABINDING 句は無視されます。 | ignore | 
| escape\_hatch\_rowguidcol\_column | テーブルを作成または変更する際、 ROWGUIDCOL 句に関連する Babelfish の動作を制御します。 | strict | 
| escape\_hatch\_schemabinding\_trigger | WITH SCHEMABINDING 句に関連する Babelfish の動作を制御します。デフォルトでは、CREATE または ALTER TRIGGER コマンドで指定した場合は、WITH SCHEMABINDING 句は無視されます。 | ignore | 
| escape\_hatch\_schemabinding\_view | WITH SCHEMABINDING 句に関連する Babelfish の動作を制御します。デフォルトでは、CREATE または ALTER VIEW コマンドで指定した場合は、WITH SCHEMABINDING 句は無視されます。 | ignore | 
| escape\_hatch\_session\_settings | サポートされていないセッションレベルの SET ステートメントに対する Babelfish の動作を制御します。 | ignore | 
| escape\_hatch\_showplan\_all | SET SHOWPLAN\_ALL と SET STATISTICS PROFILE に関連する Babelfish の動作を制御します。ignore に設定すると、SET BABELFISH\_SHOWPLAN\_ALL と SET BABELFISH\_STATISTICS PROFILE のように動作します。strict に設定すると、何も通知せずに無視されます。 | strict | 
| escape\_hatch\_storage\_on\_partition | パーティショニングの定義時に `ON partition_scheme column ` 句に関連した Babelfish の動作を制御します。Babelfish は現在、パーティショニングを実装していません。 | strict | 
| escape\_hatch\_storage\_options | CREATE、ALTER DATABASE、TABLE、INDEXで使用されるストレージオプションのハッチングをエスケープします。これには、テーブル、インデックス、制約、およびデータベースの格納場所 (パーティション、ファイルグループ) を定義する句 (LOG) ON、TEXTIMAGE\_ON、FILESTREAM\_ON が含まれます。このエスケープハッチの設定は、これらすべての句 (ON [PRIMARY] および ON [DEFAULT] を含む) に適用されます。例外は、ON partition\_scheme (カラム) を持つテーブルまたはインデックスにパーティションが指定されている場合です。 | ignore | 
| escape\_hatch\_table\_hints | WITH (…) 句を使って指定されたテーブルヒントの動作を制御します。 | ignore | 
| escape\_hatch\_unique\_constraint | strict に設定すると、インデックス付き列の NULL 値の処理における SQL Server と PostgreSQL のあいまいな意味の違いにより、エラーが発生することがあります。意味の違いは非現実的なユースケースでのみ発生するため、このエスケープハッチを「無視」に設定して、エラーが表示されないようにすることができます。<br />次のバージョンから廃止: 3.6.0 以降のバージョン、4.2.0 以降のバージョン | strict | 