Как я могу получить доступ к хранилищу больших объектов на чужой таблице
Я настроил postgres_fdw для доступа к "удаленной" базе данных (фактически она находится на том же сервере). Работает отлично. За исключением того, что один из столбцов является oid большого объекта, как я могу прочитать эти данные?
1 ответ
Я разработал, как это сделать. Доступ к хранилищу больших объектов также можно получить через таблицу pg_largeobject. Так я и сделал
create foreign table if not exists global_lo (
loid oid not null,
pageno integer not null,
data bytea
)
server glob_serv options(table_name 'pg_largeobject', schema_name 'pg_catalog');
Теперь я могу читать большой объект (все, я не могу потоковое и т. Д.) С
select data from global_lo where loid = 1234
Если у вас есть доступ к внешней базе данных, вы можете создать для нее представление, чтобы преобразовать lob
с либо bytea
или text
поэтому они могут использоваться в локальной базе данных.
В чужой базе данных вы должны создать представление:
drop view if exists tmp_view_produto_descricao;
create view tmp_view_produto_descricao as
select * from (
select dado.*, lo_get(dado.descricaoExtendida_oid) as descricaoEstendida
from (
select
itm.id as item_id,
case when itm.descricaoExtendida is Null then null else Cast(itm.descricaoExtendida as oid) end descricaoExtendida_oid
from Item itm
where itm.descricaoExtendida is Not Null
and Cast(itm.descricaoExtendida as Text) != ''
) dado
) dado
where Cast(descricaoEstendida as Text) != '';
В локальной базе данных вы должны объявить внешний вид, чтобы его можно было использовать:
create foreign table tmp_origem.tmp_view_produto_descricao (
item_id bigint,
descricaoExtendida_oid oid,
descricaoEstendida bytea
) server tmp_origem options (schema_name 'public');
Это немного сложнее и многословнее, но даст вам лучшую производительность, чем если бы вы pg_largeobject
прямо.