Как я могу получить доступ к хранилищу больших объектов на чужой таблице

Я настроил 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 прямо.

Другие вопросы по тегам