用于从 SQL 操作大型对象的服务器端函数列于表 33.1。
表 33.1. 面向 SQL 的大型对象函数
存在与前面描述的每个客户端函数相对应的其他服务器端函数;实际上,在大多数情况下,客户端函数只是等效服务器端函数的接口。可以通过 SQL 命令方便调用的函数有 lo_creat、lo_create、lo_unlink、lo_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_import 和 lo_export 函数与其客户端对应函数行为差异很大。这两个函数会读取和写入服务器文件系统中的文件,使用数据库所有者用户的权限。因此,默认情况下,它们的使用仅限于超级用户。相比之下,客户端导入和导出函数会读取和写入客户端文件系统中的文件,使用客户端程序的权限。客户端函数不需要任何数据库权限,除了读取或写入相关大型对象的权限。
可以将服务器端 lo_import 和 lo_export 函数的使用 GRANT 授予非超级用户,但需要仔细考虑安全影响。拥有此类权限的恶意用户可以轻易地将其转化为超级用户(例如,通过重写服务器配置文件),或者攻击服务器文件系统的其他部分,而无需获取数据库超级用户权限。因此,对拥有此类权限角色的访问必须像对超级用户角色一样小心保管。 尽管如此,如果某些常规任务需要使用服务器端 lo_import 或 lo_export,那么使用具有此类权限的角色比使用具有完全超级用户权限的角色更安全,因为这有助于减少因意外错误造成的损害风险。
lo_read 和 lo_write 的功能也可以通过服务器端调用实现,但服务器端函数的名称与客户端接口不同,因为它们不包含下划线。您必须将这些函数调用为 loread 和 lowrite。