0

我在 RDS 中创建了一个支持 Babelfish 的 Postgres 数据库。我连接了 SSMS 并创建了一个名为“demo”的数据库。在“演示”中,我创建了一个名为“biz”的模式。我在“biz”模式中创建了我的表和存储过程。存储过程使用不合格的表名。最后,我写了一个 .Net 程序来做一些测试。我使用 System.Data.SqlClient Connection 和 Command 类,我可以连接到数据库。当我执行存储过程时,我得到“关系“X”不存在。” 错误。如果我更改我的存储过程并使用“biz”模式限定表名,错误就会消失。

如何避免必须使用架构限定表名?

例如:创建启用 Babelfish 的 Postgres 集群后,我在 SSMS 中执行了这些语句:

create database demo
use demo
create schema biz
create table [biz].[cities](
    [city] varchar(128),
    [state] varchar(128)
    )

create procedure [biz].[p_getcities] as
begin
    select * from cities
end

insert into [biz].[cities](city, state) values ('Portland', 'OR')
insert into [biz].[cities](city, state) values ('Richmond', 'VA')

exec [biz].p_getcities

运行 p_getcities 后我收到此错误消息:

消息 33557097,第 16 级,状态 1,第 21 行关系“城市”不存在

当我切换到 pgAdmin 并尝试像这样运行存储过程时:

CALL biz.p_getcities()

我收到类似的错误:

错误:关系“城市”不存在第 1 行:从城市中选择 * ^ 查询:从城市中选择 * 上下文:PL/tsql 函数 biz.p_getcities() 第 2 行 SQL 语句 SQL 状态:42P01

但是,当我这样设置 search_path 时:

set search_path to biz

并执行存储过程,我得到了预期的结果:

波特兰或弗吉尼亚州里士满

Babelfish 中是否有相当于 search_path 的方法?

4

1 回答 1

0

此解释由rcv-aws的Rob Verschoor提供

这里发生的是过程 biz.p_getcities 中的名称解析没有正确解析表名。它将它解析为“dbo”架构,而它应该将其解析为“biz”架构。如您所述,这与 search_path 设置有关,在这种情况下设置不正确。这是一个已知的错误,我们希望尽快修复它。

在那之前,解决方法是使用模式名称限定表名,即 select * from biz.cities

于 2022-02-15T21:12:33.700 回答