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.