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

使用转义孵化管理 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”以避免看到错误。

严格