lo
模組提供對管理大型物件(也稱為 LO 或 BLOB)的支援。這包括資料型別 lo
和觸發程序 lo_manage
。
此模組被認為是 「受信任的」,也就是說,具有目前資料庫 CREATE
權限的非超級使用者可以安裝它。
JDBC 驅動程式(以及影響 ODBC 驅動程式)的問題之一是,規格假定對 BLOB(二進位大型物件)的參考儲存在表格中,如果該條目變更,則相關聯的 BLOB 會從資料庫中刪除。
就 PostgreSQL 而言,這不會發生。大型物件被視為它們自己本身的物件;表格條目可以通過 OID 參考大型物件,但是可以有多個表格條目參考相同的大型物件 OID,因此系統不會因為您變更或移除其中一個條目而刪除大型物件。
現在,這對於 PostgreSQL 專用的應用程式來說很好,但是使用 JDBC 或 ODBC 的標準程式碼不會刪除物件,導致孤立物件 — 沒有任何東西參考的物件,並且只佔用磁碟空間。
lo
模組允許通過將觸發程序附加到包含 LO 參考欄位的表格來解決此問題。 觸發程序本質上只是在您刪除或修改參考大型物件的值時執行 lo_unlink
。當您使用此觸發程序時,您假設在觸發程序控制的欄位中參考的任何大型物件只有一個資料庫參考!
該模組還提供資料型別 lo
,它實際上只是 網域 over oid
型別。 這對於區分保存大型物件參考的資料庫欄位與其他事物 OID 的欄位很有用。 您不必使用 lo
型別來使用觸發程序,但是使用它來追蹤資料庫中哪些欄位表示您正在使用觸發程序管理的大型物件可能很方便。 也有傳聞說,如果您沒有為 BLOB 欄位使用 lo
,ODBC 驅動程式會感到困惑。
這是一個簡單的使用範例
CREATE TABLE image (title text, raster lo); CREATE TRIGGER t_raster BEFORE UPDATE OR DELETE ON image FOR EACH ROW EXECUTE FUNCTION lo_manage(raster);
對於每個將包含大型物件唯一參考的欄位,建立一個 BEFORE UPDATE OR DELETE
觸發程序,並將欄位名稱作為唯一的觸發程序引數。 您也可以通過使用 BEFORE UPDATE OF
column_name
來限制觸發程序僅在對欄位進行更新時才執行。 如果您需要在同一個表格中有多個 lo
欄位,請為每個欄位建立單獨的觸發程序,請記住為同一個表格上的每個觸發程序指定不同的名稱。
刪除表格仍然會使它包含的任何物件成為孤立物件,因為觸發程序未執行。 您可以通過在 DROP TABLE
之前使用 DELETE FROM
來避免這種情況。table
TRUNCATE
具有相同的危險。
如果您已經有或懷疑有孤立的大型物件,請參閱 vacuumlo 模組,以協助您清理它們。 最好偶爾執行 vacuumlo,以作為 lo_manage
觸發程序的備用措施。
某些前端可能會建立自己的表格,並且不會建立相關聯的觸發程序。 此外,使用者可能不記得(或不知道)建立觸發程序。
Peter Mount <peter@retep.org.uk>
如果您在文件中發現任何不正確、與您特定功能的經驗不符或需要進一步澄清的內容,請使用此表格來報告文件問題。