# 35.4.服务器端功能

中列出了为从SQL操作大型对象而定制的服务器端函数表35.1.

表35.1.面向SQL的大型对象函数

作用

描述

例子
罗_来自_bytea(二倍体 老年人,数据 二进制数据) →老年人

创建一个大对象并存储*数据在里面。如果二倍体*如果为零,则系统将选择一个空闲的OID,否则将使用该OID(如果某个大型对象已经具有该OID,则会出现错误)。成功后,返回大对象的OID。

lo_from_bytea(0,“\xfffff00”)24528
卢普特 ( 二倍体 老年人, 抵消 比基特, 数据 二进制数据 ) → 无效的

写*数据*从大对象内的给定偏移开始;如有必要,放大大物体。

卢布(24528,1,“\xaa”) → ``
你明白吗 ( 二倍体 老年人 [, 抵消 比基特, 整数 ] ) → 二进制数据

提取大对象的内容或其子字符串。

lo_get(24528,0,3)\xffaaff

存在与前面描述的每个客户端功能相对应的附加服务器端功能;实际上,在大多数情况下,客户端功能只是与等效服务器端功能的接口。通过SQL命令调用同样方便的是你创造了什么, lo_create, lo_unlink, lo_进口卢奥出口.以下是它们的使用示例:

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_进口卢奥出口函数的行为与它们的客户端类似物大不相同。这两个函数使用数据库所属用户的权限读取和写入服务器文件系统中的文件。因此,默认情况下,它们的使用仅限于超级用户。相比之下,客户端导入和导出功能使用客户端程序的权限读取和写入客户端文件系统中的文件。客户端函数不需要任何数据库特权,除了读取或写入所讨论的大型对象的特权。

# 小心

有可能授予使用服务器端lo_importlo_export非超级用户的功能,但需要仔细考虑安全隐患。拥有此类权限的恶意用户可以轻松地将他们变成超级用户(例如通过重写服务器配置文件),或者可以攻击服务器文件系统的其余部分,而无需费心获得数据库超级用户权限。*因此,必须像访问超级用户角色一样谨慎地保护对具有此类特权的角色的访问。*尽管如此,如果使用服务器端lo_import要么lo_export对于某些日常任务,使用具有此类权限的角色比使用具有完全超级用户权限的角色更安全,因为这有助于降低意外错误造成损坏的风险。

的功能lo_readlo_write也可以通过服务器端调用使用,但服务器端函数的名称与客户端接口不同,因为它们不包含下划线。您必须将这些函数称为读取低俗.