使用具有有限实施的 Babelfish 功能
Babelfish 的每个新版本都增加了对某些功能的支持,这些功能可更好地与 T-SQL 功能和行为保持一致。尽管如此,当前实施中存在一些不受支持的功能和差异。下面,您可以找到有关 Babelfish 和 T-SQL 之间功能差异的信息,以及一些解决方法或使用说明。
从 Babelfish 版本 1.2.0 开始,以下功能当前具有有限实施:
SQL Server 目录(系统视图)– 目录
sys.sysconfigures
、sys.syscurconfigs
和sys.configurations
仅支持单个只读配置。当前不支持sp_configure
。有关 Babelfish 实现的其他 SQL Server 视图的更多信息,请参阅获取 Babelfish 系统目录中的信息。授予权限 – 支持 GRANT... TO PUBLIC,但是当前不支持 GRANT..TO PUBLIC WITH GRANT OPTION。
SQL Server 所有权链 和权限机制限制 – 在 Babelfish 中,SQL Server 所有权链适用于视图,但不适用于存储过程。这意味着必须授予过程对与调用过程相同的所有者拥有的其他对象的显式访问权限。在 SQL Server 中,授予调用者对该过程的 EXECUTE 权限就足以调用同一所有者拥有的其他对象。在 Babelfish 中,还必须向调用者授予对该过程访问的对象的权限。
解析非限定(没有架构名称)对象引用 – 当 SQL 对象(过程、视图、函数或触发器)引用一个对象而没有使用架构名称对其进行限定时,SQL Server 会使用引用发生的 SQL 对象的架构名称来解析对象的架构名称。目前,Babelfish 通过使用执行该过程的数据库用户的默认模式,以不同方式来解析该名称。
默认模式更改、会话和连接 – 如果用户使用
ALTER USER...WITH DEFAULT SCHEMA
更改默认模式,更改将立即在该会话中生效。但是,对于属于同一用户的其他当前连接的会话,时间有所不同,如下所示:对于 SQL Server:此更改将立即在所有其他连接中对此用户生效。
对于 Babelfish:此更改将仅在新连接中对此用户生效。
-
ROWVERSION 和 TIMESTAMP 数据类型的实现和转义孵化设置 – Babelfish 现在支持 ROWVERSION 和 TIMESTAMP 数据类型。要在 Babelfish 中使用 ROWVERSION 或 TIMESTAMP,必须将转义孵化的设置
babelfishpg_tsql.escape_hatch_rowversion
从默认值 (strict) 更改为ignore
。ROWVERSION 和 TIMESTAMP 数据类型的 Babelfish 实现在语义上基本上与 SQL Server 相同,但存在以下例外:内置的 @@DBTS 函数的行为与 SQL Server 类似,但有小的区别。由于底层 PostgreSQL 数据库引擎及其多版本并发控制 (MVCC) 实现,Babelfish 会生成新的时间戳,而不是返回上次使用的
SELECT @@DBTS
值。在 SQL Server 中,每个插入或更新的行都会获得一个唯一的 ROWVERSION/TIMESTAMP 值。在 Babelfish 中,由同一语句更新的每个插入的行都会被分配相同的 ROWVERSION/TIMESTAMP 值。
例如,当 UPDATE 语句或 INSERT-SELECT 语句影响多行时,在 SQL Server 中,受影响的行在其 ROWVERSION/TIMESTAMP 列中都有不同的值。在 Babelfish (PostgreSQL) 中,行具有相同的值。
在 SQL Server 中,当您使用 SELECT-INTO 创建新表时,可以将显式值(例如 NULL)转换为待创建的 ROWVERSION/TIMESTAMP 列。当您在 Babelfish 中做同样的事情时,Babelfish 会为新表中的每一行分配一个实际的 ROWVERSION/TIMESTAMP 值。
ROWVERSION/TIMESTAMP 数据类型的这些细微差异应该不会对在 Babelfish 上运行的应用程序产生负面影响。
模式创建、所有权和权限 – 在非 DBO 用户(使用 CREATE SCHEMA
)拥有的模式中创建和访问对象的权限与适用于 SQL Server 和 Babelfish 的非 DBO 用户不同,如下表所示:schema name
AUTHORIZATION user name
拥有模式的数据库用户(非 DBO)可以执行以下操作: | SQL Server | Babelfish |
---|---|---|
在没有 DBO 额外授权的情况下在模式中创建对象? |
否 |
是 |
访问由 DBO 在模式中创建的对象,而无需额外授权? |
是 |
否 |