W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
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)安裝。
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ì)感到困惑。
這里是一個(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)。
刪除一個(gè)表仍將讓它包含的任何對(duì)象變成孤立的,因?yàn)橛|發(fā)器在這種情況下不會(huì)被執(zhí)行。你可以在DROP TABLE
之前放上DELETE FROM
來(lái)避免這種問(wèn)題。table
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ā)器。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: