lo. Управление большими объектами (LO, Large Objects)
В исходном дистрибутиве установлено по умолчанию: нет.
Связанные компоненты: отсутствуют.
Схема размещения:
ext
.
Модуль lo
поддерживает управление большими объектами (Large Objects, Binary Large OBjects) и реализует тип данных lo
и триггер lo_manage
.
Большие объекты (LO, Large Objects или BLOB-объект, Binary Large Objects) предназначены для хранения большого объема данных.
В PostgreSQL имеется механизм для работы с большими объектами, который предоставляет доступ к пользовательским данным в потоковом режиме. Потоковый доступ удобен для обработки данных большого объема, когда невозможно оперировать ими как единым целым.
Документация по работе с большими объектами: https://www.postgresql.org/docs/current/largeobjects.html.
Особенностью драйвера JDBC
(как и ODBC
) является то, что спецификация типа предполагает хранение в таблице ссылок на BLOB-объект. Если запись меняется, связанный BLOB-объект удаляется из базы.
В PostgreSQL большие объекты обрабатываются как самостоятельные. Запись в та блице может ссылаться на большой объект по OID, при этом на него могут ссылаться несколько записей таблицы. Если меняется или удаляется такая запись, система не удаляет связанный с ней большой объект.
Вследствие работы стандартного кода, использующего JDBC
или ODBC
, большой объект не будет удален и может оказаться потерянным, то есть никак не задействованным. Он будет просто занимать место на диске.
Ориентированные на PostgreSQL приложения учитывают особенность логики СУБД и потеря большого объекта не предполагается.
Модуль lo
добавляет триггер lo_manage
к таблицам, которые содержат ссылки на большие объекты. Этот триггер вызывает функцию lo_unlink
при удалении или изменении значения, ссылающегося на большой объект.
Описание функции lo_unlink
:
-
вызов:
lo_unlink(PGconn *conn, Oid lobjId);
-
аргументы:
PGconn
– объект-соединение от библиотекиlibpq
(функции управления подключением к базе данных);lobjId
–OID
удаляемого большого объекта.
-
возвращаемое значение:
1
: успешно;-1
: неуспешно.
-
пример вызова:
SELECT lo_unlink ('5034');
Для очистки базы данных от потерянных больших объектов можно использовать функциональность приложения vacuumlo
.
Доработка
Доработка не проводилась.
Ограничения
- Пользователи или клиентские программы могут самостоятельно создавать таблицы без соответствующих триггеров, поэтому при удалении такой таблицы будут потеряны относящиеся к ней большие объекты.
- При удалении таблицы, на которой существует триггер, будут потеряны относящиеся к ней большие объекты, потому что триггер уже не будет выполняться. Чтобы этого избежать, необходимо удалить содержимое таблицы (
DELETE FROM <таблица>
) перед ее удалением (DROP/TRUNCATE
).
Установка
Модуль считается «доверенным», поэтому его могут устанавливать пользователи, имеющие право CREATE
в текущей базе данных:
CREATE EXTENSION lo SCHEMA ext;
Настройка
Настройка не требуется.
Использование модуля
Создать таблицу; столбец bigo
имеет тип данных lo
:
CREATE TABLE t_lo (name text, bigo lo);
Создать триггер lo_manage
; в качестве аргумента триггеру передать имя столбца, содержащего уникальные ссылки на большие объекты; триггер будет вызывать функцию удаления большого объекта при изменении или удалении строки:
CREATE TRIGGER t_bigo BEFORE UPDATE OR DELETE ON t_lo
FOR EACH ROW EXECUTE FUNCTION lo_manage(bigo);
Ссылки на документацию разработчика
- Дополнительно поставляемый модуль lo: https://www.postgresql.org/docs/15/lo.html.
- Документация по работе с большими объектами: https://www.postgresql.org/docs/15/largeobjects.html.
- Функции управления подключением к базе данных: https://www.postgresql.org/docs/15/libpq-connect.html.