

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用逃生艙管理 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`。
+ 若要列出目前工作階段或整個叢集的特定逃生艙及其值，請執行 `sp_babelfish_configure 'hatch_name'` 命令，其中 `hatch_name` 是一個或多個逃生艙的識別符。*hatch\$1name* 可以使用 SQL 萬用字元，例如 '%'。
+ 若要將一個或多個逃生艙設定為指定的值，請執行 `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\$1hatch\$1checkpoint |  允許在程序碼中使用 CHECKPOINT 陳述式，但目前尚未實作 CHECKPOINT 陳述式。  |  ignore  | 
| escape\$1hatch\$1constraint\$1name\$1for\$1default |  控制預設限制條件名稱相關的 Babelfish 行為。  |  ignore  | 
| escape\$1hatch\$1database\$1misc\$1options |  在 CREATE DATABASE 上控制與下列選項相關的 Babelfish 行為：CONTAINMENT、DB\$1CHAINING、TRUSTWORTHY、PERSISTENT\$1LOG\$1BUFFER。  |  ignore  | 
| escape\$1hatch\$1for\$1replication |  建立或更改資料表時，控制 [NOT] FOR REPLICATION 子句相關的 Babelfish 行為。  |  strict  | 
| escape\$1hatch\$1fulltext |  控制 FULLTEXT 功能相關的 Babelfish 行為，例如 CREATE/ALTER DATABASE 中的 DEFAULT\$1FULLTEXT\$1LANGUAGE、CREATE FULLTEXT INDEX 或 sp\$1fulltext\$1database。  |  ignore  | 
| escape\$1hatch\$1ignore\$1dup\$1key |  控制與 CREATE/ALTER TABLE 和 CREATE INDEX 相關的 Babelfish 行為。當 IGNORE\$1DUP\$1KEY=ON，如果設定為 `strict` (預設值) 將會發生錯誤，或者在設定為 `ignore` (Babelfish 1.2.0 及更高版本) 時忽略該錯誤。  |  strict  | 
| escape\$1hatch\$1index\$1clustering |  控制索引及 PRIMARY KEY 或 UNIQUE 限制條件的 CLUSTERED 或 NONCLUSTERED 關鍵字相關的 Babelfish 行為。忽略 CLUSTERED 時，仍會視為已指定 NONCLUSTERED 來建立索引或限制條件。  |  ignore  | 
| escape\$1hatch\$1index\$1columnstore |  控制 COLUMNSTORE 子句相關的 Babelfish 行為。如果指定 `ignore`，Babelfish 會建立正規 B 型樹狀結構索引。  |  strict  | 
| escape\$1hatch\$1join\$1hints |  控制 JOIN 運算子中的關鍵字行為：LOOP、HASH、MERGE、REMOTE、REDUCE、REDISTRIBUTE、REPLICATE。  |  ignore  | 
| escape\$1hatch\$1language\$1non\$1english |  控制英文以外的螢幕訊息語言相關的 Babelfish 行為。Abelfish 目前僅支援 `us_english` 的螢幕訊息。SET LANGUAGE 可能使用含有語言名稱的變數，因此只能在執行時偵測已設定的實際語言。  |  strict  | 
| escape\$1hatch\$1login\$1hashed\$1password |  忽略時會抑制 `CREATE LOGIN` 和 `ALTER LOGIN` 的 `HASHED` 關鍵字的錯誤。  |  strict  | 
| escape\$1hatch\$1login\$1misc\$1options |  忽略時，除了 `CREATE LOGIN` 和 `ALTER LOGIN` 的 `HASHED`、`MUST_CHANGE`、`OLD_PASSWORD` 及 `UNLOCK` 之外，還會抑制其他關鍵字的錯誤。  |  strict  | 
| escape\$1hatch\$1login\$1old\$1password |  忽略時會抑制 `CREATE LOGIN` 和 `ALTER LOGIN` 的 `OLD_PASSWORD` 關鍵字的錯誤。  |  strict  | 
| escape\$1hatch\$1login\$1password\$1must\$1change |  忽略時會抑制 `CREATE LOGIN` 和 `ALTER LOGIN` 的 `MUST_CHANGE` 關鍵字的錯誤。  |  strict  | 
| escape\$1hatch\$1login\$1password\$1unlock |  忽略時會抑制 `CREATE LOGIN` 和 `ALTER LOGIN` 的 `UNLOCK` 關鍵字的錯誤。  |  strict  | 
| escape\$1hatch\$1nocheck\$1add\$1constraint |  控制限制條件的 WITH CHECK 或 NOCHECK 子句相關的 Babelfish 行為。  |  strict  | 
| escape\$1hatch\$1nocheck\$1existing\$1constraint |  控制 FOREIGN KEY 或 CHECK 限制條件相關的 Babelfish 行為。  |  strict  | 
| escape\$1hatch\$1query\$1hints |  控制查詢提示相關的 Babelfish 行為。此選項設定為 ignore 時，對於使用 OPTION (...) 子句指定查詢處理事宜的提示，伺服器會忽略提示。例子包括 SELECT FROM ... OPTION(MERGE JOIN HASH, MAXRECURSION 10))。  |  ignore  | 
|  escape\$1hatch\$1rowversion | 控制 ROWVERSION 和 TIMESTAMP 資料類型的行為。如需使用方式的資訊，請參閱 [使用具有限制實作的 Babelfish 功能](babelfish-compatibility.tsql.limited-implementation.md)。 | strict | 
| escape\$1hatch\$1schemabinding\$1function |  控制 WITH SCHEMABINDING 子句相關的 Babelfish 行為。預設會忽略 CREATE 或 ALTER FUNCTION 命令中指定的 WITH SCHEMABINDING 子句。  |  ignore  | 
| escape\$1hatch\$1schemabinding\$1procedure |  控制 WITH SCHEMABINDING 子句相關的 Babelfish 行為。預設會忽略 CREATE 或 ALTER PROCEDURE 命令中指定的 WITH SCHEMABINDING 子句。  |  ignore  | 
| escape\$1hatch\$1rowguidcol\$1column |  建立或更改資料表時，控制 ROWGUIDCOL 子句相關的 Babelfish 行為。  |  strict  | 
| escape\$1hatch\$1schemabinding\$1trigger |  控制 WITH SCHEMABINDING 子句相關的 Babelfish 行為。預設會忽略 CREATE 或 ALTER TRIGGER 命令中指定的 WITH SCHEMABINDING 子句。  |  ignore  | 
| escape\$1hatch\$1schemabinding\$1view |  控制 WITH SCHEMABINDING 子句相關的 Babelfish 行為。預設會忽略 CREATE 或 ALTER VIEW 命令中指定的 WITH SCHEMABINDING 子句。  |  ignore  | 
| escape\$1hatch\$1session\$1settings |  控制不支援的工作階段層級 SET 陳述式相關的 Babelfish 行為。  |  ignore  | 
| escape\$1hatch\$1showplan\$1all |  控制與 SET SHOWPLAN\$1ALL 與 SET STATISTICS PROFILE 相關的 Babelfish 行為。當設定為 ignore 時，它們的行為類似於 SET BABELFISH\$1SHOWPLAN\$1ALL 和 SET BABELFISH\$1STATISTICS PROFILE；當設定為 strict 時，會無聲地將其忽略。  |  strict  | 
| escape\$1hatch\$1storage\$1on\$1partition |  定義分割時控制 `ON partition_scheme column ` 子句相關的 Babelfish 行為。Babelfish 目前未實作分割。  |  strict  | 
| escape\$1hatch\$1storage\$1options |  CREATE、ALTER DATABASE、TABLE、INDEX 中使用的任何儲存選項上的逃生艙 這包括子句 (LOG) ON、TEXTIMGE\$1ON、FILESTREAM\$1ON，用於定義資料表、索引、限制條件及資料庫的儲存位置 (分割區、檔案群組)。此逃生艙設定套用至以上所有子句 (包括 ON [PRIMARY] 和 ON "DEFAULT")。但以 ON partition\$1scheme (column) 指定資料表或索引的分割區時例外。  |  ignore  | 
| escape\$1hatch\$1table\$1hints |  控制使用 WITH (...) 子句指定的資料表提示的行為。  |  ignore  | 
| escape\$1hatch\$1unique\$1constraint |  設定為嚴格時，SQL Server 和 PostgreSQL 在處理索引欄上的 NULL 值方面的模糊語義差異可能會引發錯誤。語義差異只會出現於不切實際的使用案例中，因此您可將此轉義剖面設定為「忽略」以避免看到錯誤。 已從下列版本移除：3.6.0 及更新版本、4.2.0 及更新版本  |  strict  | 