33.4. Функции на стороне сервера#

33.4. Функции на стороне сервера

33.4. Функции на стороне сервера

Все серверные функции, предназначенные для работы с большими объектами из SQL, перечислены в Таблица 33.1.

Таблица 33.1. Функции для работы с SQL-ориентированными большими объектами

Функция

Описание

Пример(ы)

lo_from_bytea ( loid oid, data bytea ) → oid

Создает большой объект и сохраняет data в нем. Если loidравен нулю, то система выберет свободный OID, в противном случае будет использован указанный OID (с ошибкой, если уже существует большой объект с таким OID). При успешном выполнении возвращается OID большого объекта.

lo_from_bytea(0, '\xffffff00')24528

lo_put ( loid oid, offset bigint, data bytea ) → void

Записывает data начиная с заданного смещения внутри большого объекта; большой объект увеличивается при необходимости.

lo_put(24528, 1, '\xaa')

lo_get ( loid oid [, offset bigint, length integer ] ) → bytea

Извлекает содержимое большого объекта или его подстроку.

lo_get(24528, 0, 3)\xffaaff


Существуют дополнительные серверные функции, соответствующие каждой из описанных ранее клиентских функций; на самом деле, в большинстве случаев клиентские функции являются просто интерфейсами к эквивалентным серверным функциям. Те, которые также удобно вызывать с помощью SQL-команд, это lo_creat , lo_create, lo_unlink , lo_import , and lo_export . Вот примеры их использования:

CREATE TABLE image (
    name            text,
    raster          oid
);

SELECT lo_creat(-1);       -- returns OID of new, empty large object

SELECT lo_create(43213);   -- attempts to create large object with OID 43213

SELECT lo_unlink(173454);  -- deletes large object with OID 173454

INSERT INTO image (name, raster)
    VALUES ('beautiful image', lo_import('/etc/motd'));

INSERT INTO image (name, raster)  -- same as above, but specify OID to use
    VALUES ('beautiful image', lo_import('/etc/motd', 68583));

SELECT lo_export(image.raster, '/tmp/motd') FROM image
    WHERE name = 'beautiful image';

Серверные функции lo_import и lo_export ведут себя значительно иначе, чем их аналоги на стороне клиента. Эти две функции читают и записывают файлы в файловой системе сервера, используя разрешения пользователя, владеющего базой данных. Поэтому, по умолчанию их использование ограничено суперпользователями. В отличие от этого, функции импорта и экспорта на стороне клиента читают и записывают файлы в файловой системе клиента, используя разрешения программы клиента. Функции на стороне клиента не требуют никаких привилегий базы данных, за исключением привилегии на чтение или запись соответствующего большого объекта.

Предостережение

Возможно использование функций GRANT lo_import и lo_export на стороне сервера непривилегированными пользователями, но требуется тщательное обдумывание последствий для безопасности. Злоумышленник, обладающий такими привилегиями, может легко превратиться в суперпользователя (например, путем изменения файлов конфигурации сервера) или атаковать файловую систему сервера, не затрудняясь получением привилегий суперпользователя базы данных. Доступ к ролям, обладающим такими привилегиями, должен быть защищен так же тщательно, как доступ к ролям суперпользователя. Тем не менее, если использование функций lo_import или lo_export на стороне сервера необходимо для выполнения процедуроной задачи, безопаснее использовать роль с такими привилегиями, чем роль с полными привилегиями суперпользователя, так как это помогает снизить риск повреждения от случайных ошибок.

Сохраняется функциональность lo_read и lo_write также доступна через вызовы на стороне сервера, но имена функций на стороне сервера отличаются от интерфейсов на стороне клиента тем, что они не содержат подчеркиваний. Вы должны вызывать эти функции как loread и lowrite.