專為從 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
函式的權限 授與 給非超級使用者,但需要仔細考量安全性影響。此類權限的惡意使用者可以輕易地將其轉換為超級使用者(例如,透過重寫伺服器設定檔),或者可以攻擊伺服器檔案系統的其餘部分,而無需費心取得資料庫超級使用者權限。 因此,必須像保護超級使用者角色一樣謹慎地保護對具有此類權限的角色的存取權限。儘管如此,如果某些例行性任務需要使用伺服器端的 lo_import
或 lo_export
,則使用具有此類權限的角色比使用具有完整超級使用者權限的角色更安全,因為這有助於降低因意外錯誤造成的損害風險。
lo_read
和 lo_write
的功能也可以透過伺服器端呼叫獲得,但伺服器端函式的名稱與客戶端介面不同,因為它們不包含底線。您必須將這些函式稱為 loread
和 lowrite
。
如果您在文件中發現任何不正確、與特定功能的使用體驗不符或需要進一步說明的地方,請使用 此表單 來報告文件問題。