32.4. Функции на стороне сервера#
32.4. Функции на стороне сервера #
Все серверные функции, предназначенные для работы с большими объектами из SQL, перечислены в Таблица 32.1.
Таблица 32.1. Функции для работы с SQL-ориентированными большими объектами
Существуют дополнительные серверные функции, соответствующие каждой из описанных ранее клиентских функций; на самом деле, в большинстве случаев клиентские функции являются просто интерфейсами к эквивалентным серверным функциям. Те, которые также удобно вызывать с помощью 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
.