2024年9月26日: PostgreSQL 17 发布!
支持的版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:开发版
不支持的版本:11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

33.4. 服务器端函数 #

针对从 SQL 中操作大对象的定制服务器端函数列在表 33.1 中。

表 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_importlo_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 函数的行为与它们的客户端类似物有很大不同。这两个函数在服务器的文件系统中读取和写入文件,使用数据库拥有者的权限。因此,默认情况下,它们的使用仅限于超级用户。相反,客户端导入和导出函数在客户端的文件系统中读取和写入文件,使用客户端程序的权限。客户端函数不需要任何数据库权限,除了读取或写入相关大对象的权限。

注意

可以授予非超级用户使用服务器端 lo_importlo_export 函数的权限,但需要仔细考虑安全隐患。拥有此类权限的恶意用户可以轻松地将其转化为超级用户(例如,通过重写服务器配置文件),或者可以攻击服务器的其余文件系统,而无需费心获取数据库超级用户权限。 因此,必须像保护超级用户角色的访问权限一样小心地保护拥有此类权限的角色的访问权限。 尽管如此,如果某些常规任务需要使用服务器端 lo_importlo_export,则使用具有此类权限的角色比使用具有完整超级用户权限的角色更安全,因为这有助于降低意外错误造成的损害风险。

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

提交更正

如果您在文档中看到任何不正确的内容,与您对特定功能的体验不符,或者需要进一步澄清,请使用此表单 报告文档问题。