表 33.1 列出了为从 SQL 操作大对象而定制的服务器端函数。
表 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
函数的行为与它们的客户端类似物有很大不同。这两个函数使用数据库所有用户的权限在服务器的文件系统中读取和写入文件。因此,默认情况下,它们的使用仅限于超级用户。相反,客户端导入和导出函数使用客户端程序的权限在客户端的文件系统中读取和写入文件。客户端函数不需要任何数据库特权,除了读取或写入相关的大对象的特权。
可以 GRANT 将服务器端的 lo_import
和 lo_export
函数的使用权授予非超级用户,但需要仔细考虑安全影响。具有此类权限的恶意用户可以很容易地将其转化为成为超级用户(例如,通过重写服务器配置文件),或者可以攻击服务器文件系统的其余部分,而无需费心获得数据库超级用户权限。 因此,必须像保护超级用户角色一样仔细地保护对具有此类权限的角色的访问。 尽管如此,如果某些日常任务需要使用服务器端的 lo_import
或 lo_export
,使用具有此类权限的角色比使用具有完整超级用户权限的角色更安全,因为这有助于减少因意外错误造成的损害风险。
lo_read
和 lo_write
的功能也可以通过服务器端调用获得,但服务器端函数的名称与客户端接口的不同之处在于它们不包含下划线。您必须将这些函数调用为 loread
和 lowrite
。
如果您在文档中发现任何不正确、与特定功能的体验不符或需要进一步澄清的内容,请使用此表单报告文档问题。