PostgreSQL lo

2021-09-16 15:47 更新
F.20.1. 原理
F.20.2. 如何使用它
F.20.3. 限制

lo模塊提供管理大對(duì)象(也被稱(chēng)為 LO 或 BLOB)的支持。這包括一種數(shù)據(jù)類(lèi)型lo以及一個(gè)觸發(fā)器lo_manage

這個(gè)模塊被視為trusted,也就是說(shuō),它能夠由當(dāng)前數(shù)據(jù)庫(kù)中具有CREATE特權(quán)的非超級(jí)用戶來(lái)安裝。

F.20.1. 原理

JDBC 驅(qū)動(dòng)的問(wèn)題之一(并且這也影響 ODBC 驅(qū)動(dòng))是其說(shuō)明書(shū)假定對(duì) BLOB(二進(jìn)制大對(duì)象)的引用被存儲(chǔ)在一個(gè)表中,并且如果該項(xiàng)被改變相關(guān)的 BLOB 會(huì)被從數(shù)據(jù)庫(kù)刪除。

但對(duì)于PostgreSQL來(lái)說(shuō)這并不會(huì)發(fā)生。大對(duì)象被當(dāng)做自主的對(duì)象,一個(gè)表項(xiàng)可以通過(guò) OID 引用一個(gè)大對(duì)象,但是可以有多個(gè)表項(xiàng)引用同一個(gè)大對(duì)象 OID,因此系統(tǒng)不會(huì)因?yàn)槟愀淖兓蛘邉h除這種項(xiàng)而刪除大對(duì)象。

現(xiàn)在這對(duì)PostgreSQL-相關(guān)的應(yīng)用挺好的,但是使用 JDBC 或 ODBC 的標(biāo)準(zhǔn)代碼不會(huì)刪除那些對(duì)象,從而導(dǎo)致孤立對(duì)象 — 不被任何東西引用的對(duì)象,而且會(huì)占據(jù)磁盤(pán)空間。

lo允許通過(guò)附加一個(gè)觸發(fā)器到包含 LO 引用列的表來(lái)修復(fù)這種問(wèn)題。該觸發(fā)器本質(zhì)上只是在你刪除或修改一個(gè)引用大對(duì)象的值時(shí)做lo_unlink。當(dāng)你使用這個(gè)觸發(fā)器時(shí),你必須假定在一個(gè)觸發(fā)器控制的列中只有一個(gè)對(duì)任意大對(duì)象的數(shù)據(jù)庫(kù)引用!

這個(gè)模塊也提供了一種數(shù)據(jù)類(lèi)型lo,它實(shí)際上只是oid類(lèi)型的一個(gè)域。這有助于區(qū)分保存大對(duì)象引用的數(shù)據(jù)庫(kù)列和保存其他東西 OID 的列。你并不是必須使用lo類(lèi)型來(lái)使用該觸發(fā)器,但是用它來(lái)追蹤數(shù)據(jù)庫(kù)中哪些列表示你要用觸發(fā)器管理的大對(duì)象非常方便。也有傳言說(shuō)如果你不為 BLOB 列使用lo,ODBC 驅(qū)動(dòng)會(huì)感到困惑。

F.20.2. 如何使用它

這里是一個(gè)簡(jiǎn)單的用法示例:

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);

對(duì)每一個(gè)將包含到大對(duì)象唯一引用的列,創(chuàng)建一個(gè)BEFORE UPDATE OR DELETE觸發(fā)器,并且將該列名作為唯一的觸發(fā)器參數(shù)。你也可以用BEFORE UPDATE OF column_name來(lái)限制該觸發(fā)器只對(duì)該列上的更新事件執(zhí)行。如果你需要在同一個(gè)表中有多個(gè)lo列,為每一個(gè)創(chuàng)建一個(gè)獨(dú)立的觸發(fā)器,記住為同一個(gè)表上的每個(gè)觸發(fā)器指定一個(gè)不同的名稱(chēng)。

F.20.3. 限制

  • 刪除一個(gè)表仍將讓它包含的任何對(duì)象變成孤立的,因?yàn)橛|發(fā)器在這種情況下不會(huì)被執(zhí)行。你可以在DROP TABLE之前放上DELETE FROM table 來(lái)避免這種問(wèn)題。

    TRUNCATE有同樣的危害。

    如果你已經(jīng)有或者懷疑有孤立的大對(duì)象,參考vacuumlo模塊可以幫助你清理它們。偶爾運(yùn)行vacuumlo作為lo_manage觸發(fā)器的后備是個(gè)好主意。

  • 有些前端可能會(huì)創(chuàng)建它們自己的表,并且將不會(huì)創(chuàng)建相關(guān)的觸發(fā)器。另外,用戶可能不會(huì)記得(或知道)要?jiǎng)?chuàng)建觸發(fā)器。



以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)