2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3

52.18. pg_depend #

目錄 pg_depend 記錄了資料庫物件之間的依賴關係。這些資訊允許 DROP 命令在 DROP CASCADE 中查詢必須被刪除的其他物件,或者在 DROP RESTRICT 的情況下阻止刪除。

另請參閱 pg_shdepend,它對涉及跨資料庫叢集共享的物件之間的依賴關係執行類似的功能。

表 52.18. pg_depend

列 型別

描述

classid oid(引用 pg_class.oid

依賴物件所在的系統目錄的 OID

objid oid(引用任何 OID 列)

特定依賴物件的 OID

objsubid int4

對於表列,這是列號(objidclassid 指的是表本身)。對於所有其他物件型別,此列為零。

refclassid oid (引用 pg_class.oid)

被引用物件所在的系統目錄的 OID

refobjid oid (引用任何 OID 列)

特定被引用物件的 OID

refobjsubid int4

對於表列,這是列號(refobjidrefclassid 指的是表本身)。對於所有其他物件型別,此列為零。

deptype char

定義此依賴關係的特定語義的程式碼;參見文字


在所有情況下,pg_depend 條目都表示在刪除依賴物件之前不能刪除被引用物件。但是,deptype 標識了幾種子型別。

DEPENDENCY_NORMAL (n)

獨立建立的物件之間的正常關係。可以刪除依賴物件而不影響被引用物件。只能透過指定 CASCADE 來刪除被引用物件,在這種情況下,依賴物件也會被刪除。例如:表列與其資料型別之間存在正常依賴關係。

DEPENDENCY_AUTO (a)

依賴物件可以獨立於被引用物件刪除,並且在刪除被引用物件時(無論 RESTRICT 還是 CASCADE 模式)應該自動刪除。例如:表上的命名約束會自動依賴於表,以便在表被刪除時它也會消失。

DEPENDENCY_INTERNAL (i)

依賴物件是在建立被引用物件時作為其一部分建立的,並且實際上只是其內部實現的一部分。直接 DROP 依賴物件將被完全禁止(我們會告訴使用者改用 DROP 被引用物件)。刪除被引用物件將自動刪除依賴物件,無論是否指定了 CASCADE。如果由於依賴於要刪除的另一個物件而必須刪除依賴物件,則其刪除將被轉換為對被引用物件的刪除,以便依賴物件的 NORMALAUTO 依賴關係的行為非常類似於被引用物件的依賴關係。例如:檢視的 ON SELECT 規則會自動依賴於檢視,從而防止在檢視存在時刪除它。檢視的依賴關係(例如它引用的表)就像是檢視的依賴關係。

DEPENDENCY_PARTITION_PRI (P)
DEPENDENCY_PARTITION_SEC (S)

依賴物件是在建立被引用物件時建立的,並且實際上只是其內部實現的一部分;但是,與 INTERNAL 不同,有多個這樣的被引用物件。除非刪除至少一個這些被引用物件,否則不得刪除依賴物件;如果刪除了其中任何一個,無論是否指定 CASCADE,都應該刪除依賴物件。也與 INTERNAL 不同,刪除依賴物件所依賴的另一個物件不會導致刪除任何分割槽引用的物件。因此,如果刪除沒有透過其他路徑級聯到至少一個這些物件,則將被拒絕。(在大多數情況下,依賴物件與至少一個分割槽引用的物件共享其所有非分割槽依賴關係,因此此限制不會阻止任何級聯刪除。)主分割槽和次分割槽依賴關係的行為相同,只是主依賴關係在錯誤訊息中具有優先權;因此,分割槽依賴物件應具有一個主分割槽依賴關係和一個或多個次分割槽依賴關係。請注意,分割槽依賴關係是除了物件通常具有的任何依賴關係之外新增的,而不是替代。這簡化了 ATTACH/DETACH PARTITION 操作:只需新增或刪除分割槽依賴關係即可。例如:子分割槽索引被設定為分割槽依賴於其所在的分割槽表和父分割槽索引,因此如果刪除其中任何一個,它就會消失,否則不會。父索引的依賴關係是主要的,因此如果使用者嘗試刪除子分割槽索引,錯誤訊息將建議刪除父索引而不是表。

DEPENDENCY_EXTENSION (e)

依賴物件是所引用物件(參見 pg_extension)的 擴充套件 的成員。依賴物件只能透過對所引用物件執行 DROP EXTENSION 來刪除。在功能上,此依賴型別與 INTERNAL 依賴項的作用相同,但為了清晰和簡化 pg_dump 而單獨保留。

DEPENDENCY_AUTO_EXTENSION (x)

依賴物件不是所引用擴充套件的成員(因此 pg_dump 不會忽略它),但如果沒有該擴充套件它就無法工作,並且在擴充套件被刪除時應該自動刪除。依賴物件也可以自行刪除。在功能上,此依賴型別與 AUTO 依賴項的作用相同,但為了清晰和簡化 pg_dump 而單獨保留。

將來可能需要其他依賴項。

請注意,兩個物件透過一個以上的 pg_depend 條目連結是完全可能的。例如,子分割槽索引將對其關聯的分割槽表具有分割槽型別依賴關係,並對其索引的該表中的每個列具有自動依賴關係。這種情況表示多個依賴關係語義的並集。如果依賴關係中的任何一個滿足自動刪除的條件,則可以在不使用 CASCADE 的情況下刪除依賴物件。反之,所有依賴關係中關於必須一起刪除哪些物件的限制都必須得到滿足。

initdb 期間建立的大多數物件都被視為 固定“pinned”),這意味著系統本身依賴於它們。因此,它們永遠不允許被刪除。此外,由於知道固定物件不會被刪除,因此依賴機制不會建立顯示對它們的依賴關係的 pg_depend 條目。因此,例如,型別為 numeric 的表列名義上與 numeric 資料型別存在 NORMAL 依賴關係,但 pg_depend 中實際上並沒有此類條目。

提交更正

如果您在文件中發現任何不正確、與您使用特定功能的經驗不符或需要進一步澄清的內容,請使用 此表單 報告文件問題。