

# 使用转义孵化管理 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 语句。  |  忽略  | 
| escape\$1hatch\$1constraint\$1name\$1for\$1default |  控制与默认约束名称相关的 Babelfish 行为。  |  忽略  | 
| escape\$1hatch\$1database\$1misc\$1options |  控制与 CREATE DATABASE 上的以下选项相关的 Babelfish 行为：CONTAINMENT、DB\$1CHAINING、TRUSTWORTHY、PERSISTENT\$1LOG\$1BUFFER。  |  忽略  | 
| escape\$1hatch\$1for\$1replication |  控制创建或更改表时与 [NOT] FOR REPLICATION 子句相关的 Babelfish 行为。  |  严格  | 
| escape\$1hatch\$1fulltext |  控制与 FULLTEXT 功能相关的 Babelfish 行为，例如 CREATE/ALTER DATABASE、CREATE FULLTEXT INDEX 中的 DEFAULT\$1FULLTEXT\$1LANGUAGE 或 sp\$1fulltext\$1database。  |  忽略  | 
| escape\$1hatch\$1ignore\$1dup\$1key |  控制与 CREATE/ALTER TABLE 和 CREATE INDEX 相关的 Babelfish 行为。当 IGNORE\$1DUP\$1KEY=ON 时，设置为 `strict`（默认值）时会引发错误，设置为 `ignore` 时会忽略错误（Babelfish 版本 1.2.0 及更高版本）。  |  严格  | 
| escape\$1hatch\$1index\$1clustering |  控制与索引的 CLUSTERED 或 NONCLUSTERED 关键字相关的 Babelfish 行为以及 PRIMARY KEY 或 UNIQUE 约束。如果忽略 CLUSTERED，则仍会像指定了 NONCLUSTERED 一样创建索引或约束条件。  |  忽略  | 
| escape\$1hatch\$1index\$1columnstore |  控制与 COLUMNSTORE 子句相关的 Babelfish 行为。如果您指定 `ignore`，Babelfish 会创建一个常规的 B 树索引。  |  严格  | 
| escape\$1hatch\$1join\$1hints |  控制 JOIN 运算符中关键字的行为：LOOP、HASH、MERGE、REMOTE、REDUCE、REDISTRIBUTE、REPLICATE。  |  忽略  | 
| escape\$1hatch\$1language\$1non\$1english |  控制屏幕上的消息中与英语以外的语言相关的 Babelfish 行为。Babelfish 目前仅对屏幕上的消息支持 `us_english`。SET LANGUAGE 可能会使用包含语言名称的变量，因此只能在运行时检测到正在设置的实际语言。  |  严格  | 
| escape\$1hatch\$1login\$1hashed\$1password |  如果被忽略，则会抑制 `CREATE LOGIN` 和 `ALTER LOGIN` 的 `HASHED` 关键字。  |  严格  | 
| escape\$1hatch\$1login\$1misc\$1options |  如果被忽略，则除了 `HASHED`、`MUST_CHANGE`、`OLD_PASSWORD` 之外，还会抑制其他关键字的错误，并且还会抑制 `CREATE LOGIN` 和 `ALTER LOGIN` 的 `UNLOCK`。  |  严格  | 
| escape\$1hatch\$1login\$1old\$1password |  如果被忽略，则会抑制 `CREATE LOGIN` 和 `ALTER LOGIN` 的 `OLD_PASSWORD` 关键字。  |  严格  | 
| escape\$1hatch\$1login\$1password\$1must\$1change |  如果被忽略，则会抑制 `CREATE LOGIN` 和 `ALTER LOGIN` 的 `MUST_CHANGE` 关键字。  |  严格  | 
| escape\$1hatch\$1login\$1password\$1unlock |  如果被忽略，则会抑制 `CREATE LOGIN` 和 `ALTER LOGIN` 的 `UNLOCK` 关键字。  |  严格  | 
| escape\$1hatch\$1nocheck\$1add\$1constraint |  控制与 WITH CHECK 或 NOCHECK 子句相关的 Babelfish 行为以获取约束条件。  |  严格  | 
| escape\$1hatch\$1nocheck\$1existing\$1constraint |  控制与 FOREIGN KEY 或 CHECK 约束相关的 Babelfish 行为。  |  严格  | 
| escape\$1hatch\$1query\$1hints |  控制与查询提示相关的 Babelfish 行为。当此选项设置为忽略时，服务器将忽略使用 OPTION (...) 子句指定查询处理方面的提示。示例包括 SELECT FROM ... OPTION(MERGE JOIN HASH, MAXRECURSION 10))。  |  忽略  | 
|  escape\$1hatch\$1rowversion | 控制 ROWVERSION 和 TIMESTAMP 数据类型的行为。有关使用信息，请参阅[使用具有有限实施的 Babelfish 功能](babelfish-compatibility.tsql.limited-implementation.md)。 | 严格 | 
| escape\$1hatch\$1schemabinding\$1function |  控制与 WITH SCHEMABINDING 子句相关的 Babelfish 行为。预设情况下，使用 CREATE 或 ALTER FUNCTION 命令指定时，WITH SCHEMABINDING 子句将被忽略。  |  忽略  | 
| escape\$1hatch\$1schemabinding\$1procedure |  控制与 WITH SCHEMABINDING 子句相关的 Babelfish 行为。预设情况下，使用 CREATE 或 ALTER PROCEDURE 命令指定时，WITH SCHEMABINDING 子句将被忽略。  |  忽略  | 
| escape\$1hatch\$1rowguidcol\$1column |  控制创建或更改表时与 ROWGUIDCOL 子句相关的 Babelfish 行为。  |  严格  | 
| escape\$1hatch\$1schemabinding\$1trigger |  控制与 WITH SCHEMABINDING 子句相关的 Babelfish 行为。预设情况下，使用 CREATE 或 ALTER TRIGGER 命令指定时，WITH SCHEMABINDING 子句将被忽略。  |  忽略  | 
| escape\$1hatch\$1schemabinding\$1view |  控制与 WITH SCHEMABINDING 子句相关的 Babelfish 行为。预设情况下，使用 CREATE 或 ALTER VIEW 命令指定时，WITH SCHEMABINDING 子句将被忽略。  |  忽略  | 
| escape\$1hatch\$1session\$1settings |  控制 Babelfish 针对不受支持的会话级别 SET 语句的行为。  |  忽略  | 
| escape\$1hatch\$1showplan\$1all |  控制与 SET SHOWPLAN\$1ALL 和 SET STATISTICS PROFILE 相关的 Babelfish 行为。当设置为 ignore 时，它们的行为与 SET BABELFISH\$1SHOWPLAN\$1ALL 和 SET BABELFISH\$1STATISTICS PROFILE 类似；设置为 strict 时，它们将被无提示忽略。  |  严格  | 
| escape\$1hatch\$1storage\$1on\$1partition |  在定义分区时控制与 `ON partition_scheme column ` 子句相关的 Babelfish 行为。Babelfish 目前没有实施分区。  |  严格  | 
| escape\$1hatch\$1storage\$1options |  对 CREATE、ALTER DATABASE、TABLE、INDEX 中使用的任何存储选项的转义孵化。这包括为表、索引和约束以及为数据库定义存储位置（分区、文件组）的子句 (LOG) ON、TEXTIMAGE\$1ON、FILESTREAM\$1ON。此转义孵化设置适用于所有这些子句（包括 ON [PRIMARY] 和 ON“DEFAULT”）。例外情况是，使用 ON partition\$1scheme（列）为表或索引指定分区时。  |  忽略  | 
| escape\$1hatch\$1table\$1hints |  控制使用 WITH (...) 子句指定的表提示的行为。  |  忽略  | 
| escape\$1hatch\$1unique\$1constraint |  当设置为 strict 时，SQL Server 和 PostgreSQL 在处理索引列上的 NULL 值方面的模糊语义差异可能会引发错误。只有在不切实际的使用案例中才会出现语义差异，因此您可以将此转义孵化设置为“ignore”以避免看到错误。 在以下版本中已弃用：3.6.0 及更高版本、4.2.0 及更高版本  |  严格  | 