34.4. Серверные функции #
Функции, предназначенные для работы с большими объектами на стороне сервера из SQL, перечислены в Таблице 34.1.
Таблица 34.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
значительно отличаются от их аналогов, выполняемых на стороне клиента. Эти две функции читают и пишут файлы в файловой системе сервера с правами пользователя-владельца базы данных. Поэтому по умолчанию использовать их разрешено только суперпользователям. Клиентские функции импорта и экспорта, напротив, используют права клиентской программы для чтения и записи файлов в файловой системе клиента. Для выполнения клиентских функций никакие права в базе данных не требуется, кроме права на чтение или запись требуемого большого объекта.
Внимание
Использование серверных функций lo_import
и lo_export
можно разрешить (воспользовавшись GRANT) не только суперпользователям, но при этом следует серьёзно оценить возможные угрозы безопасности. Злонамеренный пользователь, имея такие права, легко может стать суперпользователем (например, перезаписав файлы конфигурации сервера) или атаковать другие области файловой системы сервера, не стремясь получить полномочия суперпользователя в базе данных. Поэтому доступ к ролям с такими правами должен ограничиваться так же строго, как и доступ к ролям суперпользователей. Тем не менее, если серверные функции lo_import
и lo_export
необходимо применять для каких-либо регулярных операций, безопаснее будет использовать роль с такими правами, чем с правами суперпользователя, так как это помогает предохраниться от случайных ошибок.
Функциональность lo_read
и lo_write
также представляется через вызовы на стороне сервера, но имена серверных функций, в отличие от клиентских, не содержат символы подчёркивания. Эти функции нужно вызывать по именам loread
и lowrite
.