Серверные функции, предназначенные для управления большими объектами из SQL, приведены в Таблица 4.2.1.
Таблица 4.2.1. Функции SQL для работы с большими объектами
Для каждой из описанных ранее клиентских функций существуют соответствующие серверные функции; фактически, в большинстве случаев клиентские функции являются лишь интерфейсами к аналогичным серверным функциям. К функциям, которые удобно вызывать с помощью SQL-команд, относятся
lo_creat,
lo_create,
lo_unlink,
lo_import, а также
lo_export.
Ниже приведены примеры их использования:
CREATE TABLE image (
name text,
raster oid
);
SELECT lo_creat(-1); -- возвращает OID нового пустого большого объекта
SELECT lo_create(43213); -- попытка создания большого объекта с OID 43213
SELECT lo_unlink(173454); -- удаление большого объекта с OID 173454
INSERT INTO image (name, raster)
VALUES ('beautiful image', lo_import('/etc/motd'));
INSERT INTO image (name, raster) -- то же самое, что и выше, но с указанием OID
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.