用於從 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。
如果您在文件中發現任何不正確之處、與您對特定功能的體驗不符之處或需要進一步澄清之處,請使用此表單來報告文件問題。