Перейти к основному содержимому

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);
  • аргументы:

  • возвращаемое значение:

    • 1: успешно;
    • -1: неуспешно.
  • пример вызова:

    SELECT lo_unlink ('5034');

Для очистки базы данных от потерянных больших объектов можно использовать функциональность приложения vacuumlo.

Доработка

Доработка не проводилась.

Ограничения

  1. Пользователи или клиентские программы могут самостоятельно создавать таблицы без соответствующих триггеров, поэтому при удалении такой таблицы будут потеряны относящиеся к ней большие объекты.
  2. При удалении таблицы, на которой существует триггер, будут потеряны относящиеся к ней большие объекты, потому что триггер уже не будет выполняться. Чтобы этого избежать, необходимо удалить содержимое таблицы (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);

Ссылки на документацию разработчика

  1. Дополнительно поставляемый модуль lo: https://www.postgresql.org/docs/15/lo.html.
  2. Документация по работе с большими объектами: https://www.postgresql.org/docs/15/largeobjects.html.
  3. Функции управления подключением к базе данных: https://www.postgresql.org/docs/15/libpq-connect.html.