Сохраненные процедуры с неполными именами таблиц не работают с Babelfish
Я создал базу данных Postgres с поддержкой Babelfish в RDS. Я подключился к SSMS и создал базу данных с именем «демо». В «демо» я создал схему под названием «бизнес». Я создал свои таблицы и хранимые процедуры в схеме 'biz'. В хранимых процедурах использовались неполные имена таблиц. Наконец, я написал программу .Net для тестирования. Я использую классы System.Data.SqlClient Connection и Command и могу подключиться к базе данных. Когда я выполняю хранимую процедуру, я получаю «отношение «X» не существует». ошибка. Если я изменю свою хранимую процедуру и уточню имена таблиц с помощью схемы «biz», ошибка исчезнет.
Как избежать необходимости уточнять имена таблиц схемой?
Например: после создания кластера Postgres с поддержкой Babelfish я выполнил следующие операторы в 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
И выполняя хранимую процедуру, я получаю ожидаемые результаты:
Портленд ИЛИ Ричмонд, Вирджиния
Есть ли эквивалент search_path в Babelfish?
2 ответа
Это объяснение было предоставлено Робом Вершуром из rcv-aws.
Что здесь происходит, так это то, что разрешение имен внутри процедуры biz.p_getcities неправильно разрешает имя таблицы. Он разрешает его в схему «dbo», в то время как он должен разрешать его в схему «biz». Как вы заметили, это связано с параметром search_path, и в данном случае он установлен неправильно. Это известная ошибка, и мы надеемся исправить ее в ближайшее время.
До тех пор обходным путем является уточнение имени таблицы именем схемы, т. е. выберите * из biz.cities.