PostgreSQL pg_depend

2021-09-14 10:39 更新

目錄pg_depend記錄數(shù)據(jù)庫對象之間的依賴關(guān)系。這些信息允許DROP命令查找必須被DROP CASCADE刪除的其他對象,或者在DROP RESTRICT情況下阻止刪除。

另請參閱pg_shdepend,它對在一個數(shù)據(jù)庫集簇中共享的對象之間的依賴提供了相似的功能。

表 51.18. pg_depend Columns

列類型

描述

classid oid (references pg_class.oid)

依賴對象所在的系統(tǒng)目錄OID

objid oid (references any OID column)

指定依賴對象的OID

objsubid int4

對于一個表列,這里是列號(objidclassid指表本身)。對于所有其他對象類型,此列為0。

refclassid oid (references pg_class.oid)

被引用對象所在的系統(tǒng)目錄的OID

refobjid oid (references any OID column)

指定被引用對象的OID

refobjsubid int4

對于一個表列,這里是列號(refobjidrefclassid指表本身)。對于所有其他對象類型,此列為0。

deptype char

定義此依賴關(guān)系語義的一個代碼,見文本


在所有情況下,一個pg_depend項表明被引用對象不能在沒有刪除其依賴對象的情況下被刪除。但是,其中也有多種依賴類型,由deptype標(biāo)識:

DEPENDENCY_NORMAL (n)

在獨立創(chuàng)建的對象之間的一個普通關(guān)系。依賴對象可以在不影響被依賴對象的情況下被刪除。被引用對象只能通過指定CASCADE被刪除,在這種情況下依賴對象也會被刪除。 例子:一個表列對于其數(shù)據(jù)類型有一個普通依賴。

DEPENDENCY_AUTO (a)

依賴對象可以被獨立于被依賴對象刪除,且應(yīng)該在被引用對象被刪除時自動被刪除(不管在RESTRICTCASCADE模式)。例子:一個表上的一個命名約束應(yīng)該被設(shè)置為自動依賴于表,這樣在表被刪除后它也會消失。

DEPENDENCY_INTERNAL (i)

依賴對象作為被引用對象創(chuàng)建過程的一部分被創(chuàng)建,并且只是其內(nèi)部實現(xiàn)的一部分。不允許直接DROP所依賴的對象(而是告訴用戶對引用對象發(fā)出DROP操作)。無論是否指定了CASCADE,DROP被引用的對象都將導(dǎo)致自動刪除從屬對象。如果由于刪除了對某些其他對象的依賴關(guān)系而不得不刪除依賴對象,則其刪除將轉(zhuǎn)換為對所引用對象的刪除,因此依賴對象的 NORMALAUTO依賴關(guān)系的行為就像它們是所引用對象的依賴關(guān)系。示例:視圖的ON SELECT規(guī)則使其在內(nèi)部依賴于視圖,以防止在視圖保留時將其刪除。規(guī)則的依賴關(guān)系(例如它引用的表)就好像他們是視圖的依賴關(guān)系。

DEPENDENCY_PARTITION_PRI (P)
DEPENDENCY_PARTITION_SEC (S)

依賴對象被作為被引用對象創(chuàng)建過程的一部分創(chuàng)建,并且確實是其內(nèi)部實現(xiàn)的一部分。但是,不像INTERNAL,有多個這樣的引用對象。除非刪除了這些引用對象中的至少一個對象,否則不得刪除依賴對象;如果其中任何一個被刪除,則不管是否指定了CASCADE,都應(yīng)刪除依賴對象。也不像INTERNAL,依賴對象所依賴的某些其他對象的刪除不會導(dǎo)致任何分區(qū)引用的對象的自動刪除。因此,如果刪除沒有通過其他路徑級聯(lián)到這些對象中的至少一個,它會被拒絕。(大多數(shù)情況下,依賴對象與至少一個分區(qū)引用對象共享所有非分區(qū)的依賴關(guān)系,因此此限制不會導(dǎo)致阻止任何級聯(lián)的刪除。)主分區(qū)和輔助分區(qū)的依賴關(guān)系表現(xiàn)相同,除了主分區(qū)依賴關(guān)系傾向用于錯誤消息;因此,分區(qū)相關(guān)的對象應(yīng)該有一個主分區(qū)依賴關(guān)系和一個或多個輔助分區(qū)依賴關(guān)系。注意到分區(qū)依賴關(guān)系是任何對象所正常擁有的依賴關(guān)系的補充,而不是替代。這簡化了 ATTACH/DETACH PARTITION操作:只要添加或刪除分區(qū)的依賴關(guān)系。例如:子分區(qū)索引與其所基于的分區(qū)表和父分區(qū)索引是分區(qū)相關(guān)的,因此只要其中一個刪除,則子分區(qū)索引就消失,否則,就不消失。父索引上的依賴關(guān)系是主要的,故如果用戶試圖刪除子分區(qū)索引,錯誤消息反而會建議刪除父索引(不是表)。

DEPENDENCY_EXTENSION (e)

依賴對象是作為擴展的被引用對象的一個成員(參見pg_extension)。依賴對象可以通過被引用對象上的DROP EXTENSION來刪除。在功能上,這種依賴類型和一個 INTERNAL依賴的作用相同,其存在只是為了清晰和簡化pg_dump。

DEPENDENCY_AUTO_EXTENSION (x)

依賴對象不是作為被引用對象的擴展的成員(因此不應(yīng)該被pg_dump忽略),但是沒有該擴展它又無法工作,因此如果刪除了擴展,則該依賴對象應(yīng)自動刪除。該依賴對象也可以獨立刪除。功能上,該依賴關(guān)系類型與AUTO依賴相同,但是為了清晰起見和簡化pg_dump,將其分開。

DEPENDENCY_PIN (p)

沒有依賴對象,這種類型的項是一個信號,用于說明系統(tǒng)本身依賴于被引用對象,并且該對象永遠不能被刪除。這種類型的項只能被initdb創(chuàng)建。而此種項的依賴對象的列都為0。

在未來可能會需要其他依賴類型。

要注意的是,兩個對象很有可能由不止一個pg_depend條目來鏈接。例如子分區(qū)索引有一個依賴于其關(guān)聯(lián)的分區(qū)表的分區(qū)類型的依賴關(guān)系和依賴于該表索引的每一列的自動依賴關(guān)系。此類情形表示多重依賴關(guān)系語義的并集,依賴對象的刪除可以沒有CASCADE,如果其任一依賴關(guān)系滿足自動刪除的條件。相反地,關(guān)于哪些對象必須一起刪除的所有依賴關(guān)系的限制必須滿足。


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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號