

# 使用转义孵化管理 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\_name}} 可以使用 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\_hatch\_checkpoint | 允许在过程代码中使用 CHECKPOINT 语句，但当前尚未实现 CHECKPOINT 语句。 | 忽略 | 
| escape\_hatch\_constraint\_name\_for\_default | 控制与默认约束名称相关的 Babelfish 行为。 | 忽略 | 
| escape\_hatch\_database\_misc\_options | 控制与 CREATE DATABASE 上的以下选项相关的 Babelfish 行为：CONTAINMENT、DB\_CHAINING、TRUSTWORTHY、PERSISTENT\_LOG\_BUFFER。 | 忽略 | 
| escape\_hatch\_for\_replication | 控制创建或更改表时与 [NOT] FOR REPLICATION 子句相关的 Babelfish 行为。 | 严格 | 
| escape\_hatch\_fulltext | 控制与 FULLTEXT 功能相关的 Babelfish 行为，例如 CREATE/ALTER DATABASE、CREATE FULLTEXT INDEX 中的 DEFAULT\_FULLTEXT\_LANGUAGE 或 sp\_fulltext\_database。 | 忽略 | 
| escape\_hatch\_ignore\_dup\_key | 控制与 CREATE/ALTER TABLE 和 CREATE INDEX 相关的 Babelfish 行为。当 IGNORE\_DUP\_KEY=ON 时，设置为 `strict`（默认值）时会引发错误，设置为 `ignore` 时会忽略错误（Babelfish 版本 1.2.0 及更高版本）。 | 严格 | 
| escape\_hatch\_index\_clustering | 控制与索引的 CLUSTERED 或 NONCLUSTERED 关键字相关的 Babelfish 行为以及 PRIMARY KEY 或 UNIQUE 约束。如果忽略 CLUSTERED，则仍会像指定了 NONCLUSTERED 一样创建索引或约束条件。 | 忽略 | 
| escape\_hatch\_index\_columnstore | 控制与 COLUMNSTORE 子句相关的 Babelfish 行为。如果您指定 `ignore`，Babelfish 会创建一个常规的 B 树索引。 | 严格 | 
| escape\_hatch\_join\_hints | 控制 JOIN 运算符中关键字的行为：LOOP、HASH、MERGE、REMOTE、REDUCE、REDISTRIBUTE、REPLICATE。 | 忽略 | 
| escape\_hatch\_language\_non\_english | 控制屏幕上的消息中与英语以外的语言相关的 Babelfish 行为。Babelfish 目前仅对屏幕上的消息支持 `us_english`。SET LANGUAGE 可能会使用包含语言名称的变量，因此只能在运行时检测到正在设置的实际语言。 | 严格 | 
| escape\_hatch\_login\_hashed\_password | 如果被忽略，则会抑制 `CREATE LOGIN` 和 `ALTER LOGIN` 的 `HASHED` 关键字。 | 严格 | 
| escape\_hatch\_login\_misc\_options | 如果被忽略，则除了 `HASHED`、`MUST_CHANGE`、`OLD_PASSWORD` 之外，还会抑制其他关键字的错误，并且还会抑制 `CREATE LOGIN` 和 `ALTER LOGIN` 的 `UNLOCK`。 | 严格 | 
| escape\_hatch\_login\_old\_password | 如果被忽略，则会抑制 `CREATE LOGIN` 和 `ALTER LOGIN` 的 `OLD_PASSWORD` 关键字。 | 严格 | 
| escape\_hatch\_login\_password\_must\_change | 如果被忽略，则会抑制 `CREATE LOGIN` 和 `ALTER LOGIN` 的 `MUST_CHANGE` 关键字。 | 严格 | 
| escape\_hatch\_login\_password\_unlock | 如果被忽略，则会抑制 `CREATE LOGIN` 和 `ALTER LOGIN` 的 `UNLOCK` 关键字。 | 严格 | 
| escape\_hatch\_nocheck\_add\_constraint | 控制与 WITH CHECK 或 NOCHECK 子句相关的 Babelfish 行为以获取约束条件。 | 严格 | 
| escape\_hatch\_nocheck\_existing\_constraint | 控制与 FOREIGN KEY 或 CHECK 约束相关的 Babelfish 行为。 | 严格 | 
| escape\_hatch\_query\_hints | 控制与查询提示相关的 Babelfish 行为。当此选项设置为忽略时，服务器将忽略使用 OPTION (...) 子句指定查询处理方面的提示。示例包括 SELECT FROM ... OPTION(MERGE JOIN HASH, MAXRECURSION 10))。 | 忽略 | 
|  escape\_hatch\_rowversion | 控制 ROWVERSION 和 TIMESTAMP 数据类型的行为。有关使用信息，请参阅[使用具有有限实施的 Babelfish 功能](babelfish-compatibility.tsql.limited-implementation.md)。 | 严格 | 
| escape\_hatch\_schemabinding\_function | 控制与 WITH SCHEMABINDING 子句相关的 Babelfish 行为。预设情况下，使用 CREATE 或 ALTER FUNCTION 命令指定时，WITH SCHEMABINDING 子句将被忽略。 | 忽略 | 
| escape\_hatch\_schemabinding\_procedure | 控制与 WITH SCHEMABINDING 子句相关的 Babelfish 行为。预设情况下，使用 CREATE 或 ALTER PROCEDURE 命令指定时，WITH SCHEMABINDING 子句将被忽略。 | 忽略 | 
| escape\_hatch\_rowguidcol\_column | 控制创建或更改表时与 ROWGUIDCOL 子句相关的 Babelfish 行为。 | 严格 | 
| escape\_hatch\_schemabinding\_trigger | 控制与 WITH SCHEMABINDING 子句相关的 Babelfish 行为。预设情况下，使用 CREATE 或 ALTER TRIGGER 命令指定时，WITH SCHEMABINDING 子句将被忽略。 | 忽略 | 
| escape\_hatch\_schemabinding\_view | 控制与 WITH SCHEMABINDING 子句相关的 Babelfish 行为。预设情况下，使用 CREATE 或 ALTER VIEW 命令指定时，WITH SCHEMABINDING 子句将被忽略。 | 忽略 | 
| escape\_hatch\_session\_settings | 控制 Babelfish 针对不受支持的会话级别 SET 语句的行为。 | 忽略 | 
| escape\_hatch\_showplan\_all | 控制与 SET SHOWPLAN\_ALL 和 SET STATISTICS PROFILE 相关的 Babelfish 行为。当设置为 ignore 时，它们的行为与 SET BABELFISH\_SHOWPLAN\_ALL 和 SET BABELFISH\_STATISTICS PROFILE 类似；设置为 strict 时，它们将被无提示忽略。 | 严格 | 
| escape\_hatch\_storage\_on\_partition | 在定义分区时控制与 `ON partition_scheme column ` 子句相关的 Babelfish 行为。Babelfish 目前没有实施分区。 | 严格 | 
| escape\_hatch\_storage\_options | 对 CREATE、ALTER DATABASE、TABLE、INDEX 中使用的任何存储选项的转义孵化。这包括为表、索引和约束以及为数据库定义存储位置（分区、文件组）的子句 (LOG) ON、TEXTIMAGE\_ON、FILESTREAM\_ON。此转义孵化设置适用于所有这些子句（包括 ON [PRIMARY] 和 ON“DEFAULT”）。例外情况是，使用 ON partition\_scheme（列）为表或索引指定分区时。 | 忽略 | 
| escape\_hatch\_table\_hints | 控制使用 WITH (...) 子句指定的表提示的行为。 | 忽略 | 
| escape\_hatch\_unique\_constraint | 当设置为 strict 时，SQL Server 和 PostgreSQL 在处理索引列上的 NULL 值方面的模糊语义差异可能会引发错误。只有在不切实际的使用案例中才会出现语义差异，因此您可以将此转义孵化设置为“ignore”以避免看到错误。<br />在以下版本中已弃用：3.6.0 及更高版本、4.2.0 及更高版本 | 严格 | 