Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16 / 17

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 函数的使用权 GRANT 授予非超级用户,但需要仔细考虑安全影响。此类特权的恶意用户可以轻易地利用它们成为超级用户(例如,重写服务器配置文件),或者可以攻击服务器文件系统的其余部分,而不必费心获得数据库超级用户特权。因此,必须像访问超级用户角色一样谨慎地保护对拥有此类特权角色的访问权限。然而,如果出于某些例行任务的需要,可以使用服务器端 lo_importlo_export,则使用具有此类特权的角色比使用具有完全超级用户特权的角色更安全,因为这有助于降低因意外错误而造成损害的风险。

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