powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Oid поле в Foreign Table, как получить bytea из Foreign Server?
8 сообщений из 8, страница 1 из 1
Oid поле в Foreign Table, как получить bytea из Foreign Server?
    #39562748
butcher40
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Собственно, сабж. Версия базы - 9.4.
Проблема возникла при проектировании центральной базы для публичного доступа (в режиме чтения), которая сливает данные из нескольких региональные баз.
1. При запросах ниже, функция lo_get лезет в pg_largeobject центральной базы. Естественно, ничего не находит.

select lo_get(f1.col_oid)
from foreign_table1 f1
where f1.col_oid = 333768;

select lo_get(f2.col_oid)
from foreign_table2 f2
where f2.col_oid = 333768;

Таблицы foreign_table1 и foreign_table2 имеют идентичную структуру, с разных серверов, но имеют одинаковые Oid.
...
Рейтинг: 0 / 0
Oid поле в Foreign Table, как получить bytea из Foreign Server?
    #39562783
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
butcher40Собственно, сабж. Версия базы - 9.4.
Проблема возникла при проектировании центральной базы для публичного доступа (в режиме чтения), которая сливает данные из нескольких региональные баз.
1. При запросах ниже, функция lo_get лезет в pg_largeobject центральной базы. Естественно, ничего не находит.

select lo_get(f1.col_oid)
from foreign_table1 f1
where f1.col_oid = 333768;

select lo_get(f2.col_oid)
from foreign_table2 f2
where f2.col_oid = 333768;

Таблицы foreign_table1 и foreign_table2 имеют идентичную структуру, с разных серверов, но имеют одинаковые Oid.

Я могу только рекомендовать использовать bytea поле вместо LO, будет больше пользы.
Через FDW к удаленным LO по моему никак не подобраться.

PS: можно попробовать сделать view на remote стороне вида
Код: plsql
1.
2.
select f2.col_oid, lo_get(f2.col_oid) as lo
from foreign_table2 f2


и к нему через fdw ходить.... в теории я не вижу почему это не будет работать.
...
Рейтинг: 0 / 0
Oid поле в Foreign Table, как получить bytea из Foreign Server?
    #39562830
butcher40
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Boguk
Я могу только рекомендовать использовать bytea поле вместо LO, будет больше пользы.
Через FDW к удаленным LO по моему никак не подобраться.

PS: можно попробовать сделать view на remote стороне вида
Код: plsql
1.
2.
select f2.col_oid, lo_get(f2.col_oid) as lo
from foreign_table2 f2


и к нему через fdw ходить.... в теории я не вижу почему это не будет работать.

Это и было сделано, как временное решение для materialized view.
От oid пока сложно отказаться, ввиду завязки на него хибернейтовских драйверов и всякой лабуды.
Просто странно, если oid не поддерживается на уровне fdw, то нафиг его вообще в foreign таблицах поддерживать.
...
Рейтинг: 0 / 0
Oid поле в Foreign Table, как получить bytea из Foreign Server?
    #39562848
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
butcher40,

У LO свои собственные OID-ы, которые присваиваются в момент создания LO. Обычно их сохраняют в таблицах, чтобы потом можно было обратиться к нужным логически связанным LO.

В вашем случае в `col_oid` храниться oid для LO, который привязан к записи. Т.е. в данном случае `oid` в название колонки — это выбор того, кто реализовывал этот функционал и создавал таблички.
...
Рейтинг: 0 / 0
Oid поле в Foreign Table, как получить bytea из Foreign Server?
    #39562934
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
butcher40Это и было сделано, как временное решение для materialized view.
От oid пока сложно отказаться, ввиду завязки на него хибернейтовских драйверов и всякой лабуды.
Просто странно, если oid не поддерживается на уровне fdw, то нафиг его вообще в foreign таблицах поддерживать.

oid это просто идентификатор объекта в базе (внутри это обычный int), который совсем не обязательно ссылка на файл/large object, бывают просто таблицы с oid полем которое никак с large objects не связано.
Т.е. oid поддерживается нормально, а вот доступ к удаленным large objects по oid нет (но это уже другой вопрос совсем).

В теории вы вообще вместо lo_get(f1.col_oid) можете вызвать lo_get(1255756) и если такой large object есть - вы его получите, никакой магии там нет.
...
Рейтинг: 0 / 0
Oid поле в Foreign Table, как получить bytea из Foreign Server?
    #39563641
butcher40
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Bogukoid это просто идентификатор объекта в базе (внутри это обычный int), который совсем не обязательно ссылка на файл/large object, бывают просто таблицы с oid полем которое никак с large objects не связано.
Т.е. oid поддерживается нормально, а вот доступ к удаленным large objects по oid нет (но это уже другой вопрос совсем).

В теории вы вообще вместо lo_get(f1.col_oid) можете вызвать lo_get(1255756) и если такой large object есть - вы его получите, никакой магии там нет.

"oid это просто идентификатор объекта в базе." - для foreign table - в УДАЛЕННОЙ БАЗЕ.
Было бы логично пробрасывать в fwd вызов функций на удаленный сервер.
...
Рейтинг: 0 / 0
Oid поле в Foreign Table, как получить bytea из Foreign Server?
    #39563644
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
butcher40,

Учитывая, что LO достаточно несуразное решение (есть более удобный `bytea`), проект не развивает это направление.
Проброса ф-ий на удалённый сервер я бы не ждал, совсем.
...
Рейтинг: 0 / 0
Oid поле в Foreign Table, как получить bytea из Foreign Server?
    #39563654
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
butcher40Maxim Bogukoid это просто идентификатор объекта в базе (внутри это обычный int), который совсем не обязательно ссылка на файл/large object, бывают просто таблицы с oid полем которое никак с large objects не связано.
Т.е. oid поддерживается нормально, а вот доступ к удаленным large objects по oid нет (но это уже другой вопрос совсем).

В теории вы вообще вместо lo_get(f1.col_oid) можете вызвать lo_get(1255756) и если такой large object есть - вы его получите, никакой магии там нет.

"oid это просто идентификатор объекта в базе." - для foreign table - в УДАЛЕННОЙ БАЗЕ.
Было бы логично пробрасывать в fwd вызов функций на удаленный сервер.

А как понять что lo_get(1255756) вы хотите удаленный обьект а не локальный, ведь ничего же не запрещает хранить обьекты в одной базе а их oids - в другой совсем.
На этапе когда вызывается фукция - в нее просто Int приходит и никакой информации о том откуда этот инт пришел и что значит - нет и не может быть на уровне текущей архитектуры базы.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Oid поле в Foreign Table, как получить bytea из Foreign Server?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]