как я могу получить доступ к хранилищу больших объектов на чужой таблице - PullRequest
0 голосов
/ 11 июня 2018

Я настроил postgres_fdw для доступа к «удаленной» базе данных (фактически она находится на том же сервере).Работает отлично.За исключением того, что один из столбцов является oid большого объекта, как я могу прочитать эти данные?

Ответы [ 2 ]

0 голосов
/ 15 июля 2019

Если у вас есть доступ к внешней базе данных, вы можете создать представление для нее, чтобы преобразовать lob s в 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 напрямую.

0 голосов
/ 12 июня 2018

Я разобрался, как это сделать.Доступ к хранилищу больших объектов также можно получить через таблицу 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
...