使用转义孵化管理 Babelfish 错误处理 - Amazon Aurora
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

使用转义孵化管理 Babelfish 错误处理

在可能的情况下,Babelfish 会针对控制流和事务状态模仿 SQL 行为。当 Babelfish 遇到错误时,它会返回与 SQL Server 错误代码类似的错误代码。如果 Babelfish 无法将错误映射到 SQL Server 代码,它会返回一个固定的错误代码 (33557097),并根据错误类型采取具体操作,如下所示:

  • 对于编译时错误,Babelfish 会回滚事务。

  • 对于运行时错误,Babelfish 会结束批处理并回滚事务。

  • 对于客户端和服务器之间的协议错误,不会回滚该事务。

如果错误代码无法映射到等效代码并且类似错误的代码可用,则错误代码将映射到替代代码。例如,导致 SQL Server 代码 81438144 的行为都会映射到 8143

无法映射的错误不尊重 TRY... CATCH 构造。

您可以使用 @@ERROR 返回 SQL Server 错误代码,或使用 @@PGERROR 函数返回 PostgreSQL 错误代码。您也可以使用 fn_mapped_system_error_list 函数返回映射的错误代码列表。有关 PostgreSQL 错误代码的信息,请参阅 PostgreSQL 网站

修改 Babelfish 转义孵化设置

为了处理可能失败的语句,Babelfish 定义了一些称为转义孵化的选项。转义孵化是一个选项,用于在遇到不受支持的功能或语法时的指定 Babelfish 行为。

您可以使用 sp_babelfish_configure 存储过程来控制转义孵化的设置。使用脚本将转义孵化设置为 ignorestrict。如果设置为 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 或 ALTER 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 LOGINALTER LOGINHASHED 关键字。

严格

escape_hatch_login_misc_options

如果被忽略,则除了 HASHEDMUST_CHANGEOLD_PASSWORD 之外,还会抑制其他关键字的错误,并且还会抑制 CREATE LOGINALTER LOGINUNLOCK

严格

escape_hatch_login_old_password

如果被忽略,则会抑制 CREATE LOGINALTER LOGINOLD_PASSWORD 关键字。

严格

escape_hatch_login_password_must_change

如果被忽略,则会抑制 CREATE LOGINALTER LOGINMUST_CHANGE 关键字。

严格

escape_hatch_login_password_unlock

如果被忽略,则会抑制 CREATE LOGINALTER LOGINUNLOCK 关键字。

严格

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 功能

严格

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”以避免看到错误。

严格