使用转义孵化管理 Babelfish 错误处理
在可能的情况下,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 网站
修改 Babelfish 转义孵化设置
为了处理可能失败的语句,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 或 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 时,设置为 |
严格 |
escape_hatch_index_clustering |
控制与索引的 CLUSTERED 或 NONCLUSTERED 关键字相关的 Babelfish 行为以及 PRIMARY KEY 或 UNIQUE 约束。如果忽略 CLUSTERED,则仍会像指定了 NONCLUSTERED 一样创建索引或约束条件。 |
忽略 |
escape_hatch_index_columnstore |
控制与 COLUMNSTORE 子句相关的 Babelfish 行为。如果您指定 |
严格 |
escape_hatch_join_hints |
控制 JOIN 运算符中关键字的行为:LOOP、HASH、MERGE、REMOTE、REDUCE、REDISTRIBUTE、REPLICATE。 |
忽略 |
escape_hatch_language_non_english |
控制屏幕上的消息中与英语以外的语言相关的 Babelfish 行为。Babelfish 目前仅对屏幕上的消息支持 |
严格 |
escape_hatch_login_hashed_password |
如果被忽略,则会抑制 |
严格 |
escape_hatch_login_misc_options |
如果被忽略,则除了 |
严格 |
escape_hatch_login_old_password |
如果被忽略,则会抑制 |
严格 |
escape_hatch_login_password_must_change |
如果被忽略,则会抑制 |
严格 |
escape_hatch_login_password_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 功能。 |
严格 |
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 |
在定义分区时控制与 |
严格 |
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”以避免看到错误。 |
严格 |