支援版本: 目前 (17) / 16 / 15 / 14 / 13
開發版本: devel
不支援版本: 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 函式的行為與它們的客戶端對應項有很大不同。 這兩個函式使用資料庫擁有使用者的權限,在伺服器的檔案系統中讀取和寫入檔案。 因此,預設情況下,它們的使用僅限於超級使用者。 相反,客戶端匯入和匯出函式使用客戶端程式的權限,在客戶端的檔案系統中讀取和寫入檔案。 客戶端函式不需要任何資料庫權限,除了讀取或寫入相關大型物件的權限之外。

注意

可以 GRANT 將伺服器端 lo_importlo_export 函式的使用權授予非超級使用者,但需要仔細考慮安全隱含。 具有此類權限的惡意使用者可以很容易地將它們轉換為超級使用者(例如,通過重寫伺服器設定檔),或者可以在不費心獲得資料庫超級使用者權限的情況下攻擊伺服器的其餘檔案系統。 因此,對具有此類權限的角色的存取必須像對超級使用者角色的存取一樣謹慎地進行保護。 儘管如此,如果某些例行任務需要使用伺服器端 lo_importlo_export,則使用具有此類權限的角色比使用具有完整超級使用者權限的角色更安全,因為這有助於降低意外錯誤造成的損害風險。

lo_readlo_write 的功能也可通過伺服器端呼叫使用,但伺服器端函式的名稱與客戶端介面不同,因為它們不包含底線。 您必須將這些函式稱為 loreadlowrite

提交更正

如果您在文件中發現任何不正確、與您使用特定功能的經驗不符,或需要進一步澄清之處,請使用此表單來回報文件問題。