Las funciones en el servidor diseñadas para manipular objetos grandes desde SQL se enumeran en la Table 33.1.
Table 33.1. Funciones de objetos grandes orientadas a SQL
Existen funciones adicionales en el servidor correspondientes a cada una de las
funciones de cliente descritas anteriormente; de hecho, en su mayor parte, las
funciones de cliente son simplemente interfaces para las funciones de servidor
equivalentes. Las que son igualmente convenientes de llamar mediante comandos SQL
son lo_creat,
lo_create,
lo_unlink,
lo_import y
lo_export.
Aquí tienes ejemplos de su uso:
CREATE TABLE image (
name text,
raster oid
);
SELECT lo_creat(-1); -- devuelve el OID del nuevo objeto grande vacío
SELECT lo_create(43213); -- intenta crear un objeto grande con OID 43213
SELECT lo_unlink(173454); -- elimina el objeto grande con OID 173454
INSERT INTO image (name, raster)
VALUES ('beautiful image', lo_import('/etc/motd'));
INSERT INTO image (name, raster) -- igual que arriba, pero especificando el OID a usar
VALUES ('beautiful image', lo_import('/etc/motd', 68583));
SELECT lo_export(image.raster, '/tmp/motd') FROM image
WHERE name = 'beautiful image';
Las funciones en el servidor lo_import y
lo_export se comportan de manera considerablemente diferente
a sus análogas en el cliente. Estas dos funciones leen y escriben archivos en el
sistema de archivos del servidor, utilizando los permisos del usuario propietario
de la base de datos. Por lo tanto, por defecto, su uso está restringido a los
superusuarios. En contraste, las funciones de importación y exportación en el cliente
leen y escriben archivos en el sistema de archivos del cliente, utilizando los
permisos del programa cliente. Las funciones del lado del cliente no requieren ningún
privilegio de base de datos, excepto el privilegio para leer o escribir el objeto
grande en cuestión.
Es posible otorgar (GRANT) el uso de las funciones del lado
del servidor lo_import y lo_export a
no superusuarios, pero se requiere una consideración cuidadosa de las implicaciones
de seguridad. Un usuario malicioso con tales privilegios podría convertirlos fácilmente
en superusuario (por ejemplo, reescribiendo archivos de configuración del servidor),
o podría atacar el resto del sistema de archivos del servidor sin molestarse en obtener
privilegios de superusuario de la base de datos como tal. Por lo tanto, el
acceso a roles que tengan tal privilegio debe protegerse con el mismo cuidado que el
acceso a los roles de superusuario. No obstante, si se necesita usar
lo_import o lo_export en el servidor para
alguna tarea rutinaria, es más seguro usar un rol con esos privilegios que uno con
privilegios de superusuario completos, ya que eso ayuda a reducir el riesgo de daños
por errores accidentales.
La funcionalidad de lo_read y lo_write
también está disponible mediante llamadas en el servidor, pero los nombres de las
funciones en el servidor difieren de las interfaces de cliente en que no contienen
guiones bajos. Debes llamar a estas funciones como loread y
lowrite.