受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发版本: devel

33.4. 服务器端函数 #

专为通过 SQL 操纵大对象而设计的服务器端函数列在Table 33.1中。

Table 33.1. 面向 SQL 的大对象函数

函数

描述

示例

lo_from_bytea ( loid oid, data bytea ) → oid

创建一个大对象并将data存储在其中。如果loid为零,则系统会选择一个空闲 OID;否则就使用该 OID(如果某个大对象已经具有该 OID,则会报错)。成功时返回该大对象的 OID。

lo_from_bytea(0, '\xffffff00')24528

lo_put ( loid oid, offset bigint, data bytea ) → void

从给定偏移量开始把data写入大对象;必要时会扩展该大对象。

lo_put(24528, 1, '\xaa')

lo_get ( loid oid [, offset bigint, length integer ] ) → bytea

提取大对象的内容,或其中的一个子串。

lo_get(24528, 0, 3)\xffaaff


前面介绍的每个客户端函数都有对应的服务器端函数;实际上,大多数客户端函数都只是等价服务器端函数的接口。通过 SQL 命令调用起来同样方便的有lo_creatlo_createlo_unlinklo_import以及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_importlo_export函数与其客户端对应函数的行为差异很大。这两个函数在服务器的文件系统中读写文件,使用数据库所有者的权限。因此,默认情况下它们的使用仅限于超级用户。相比之下,客户端导入和导出函数在客户端的文件系统中读写文件,使用客户端程序的权限。客户端函数不需要任何数据库权限,除了读取或写入相关大对象所需的权限。

Caution

可以使用GRANT将服务器端lo_importlo_export函数的使用权限授予非超级用户,但必须仔细考虑其安全影响。恶意用户如果拥有这类权限,很容易借此升级为超级用户(例如通过重写服务器配置文件),或者无需真正取得数据库超级用户权限就可以攻击服务器文件系统的其他部分。因此,对拥有此类权限的角色的访问必须像对超级用户角色的访问一样谨慎地加以保护。尽管如此,如果某项日常任务确实需要使用服务器端lo_importlo_export,那么使用具有此类权限的角色仍然比使用拥有完整超级用户权限的角色更安全,因为这样有助于降低意外错误造成破坏的风险。

lo_readlo_write的功能也可以通过服务器端调用获得,但服务器端函数名与客户端接口不同,因为它们不包含下划线。必须将这些函数调用为loreadlowrite

提交更正

如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。