43.13. pg_depend

pg_depend 表記錄數據庫對象之間的依賴 關系。這個信息允許 DROP 命令找出哪些其他的對象必須 由 DROP CASCADE 刪除,或者是在 DROP RESTRICT 的情況下避免刪除。

Table 43-13. pg_depend 字段

名字類型引用描述
classidoidpg_class.oid有倚賴對象所在系統表的 OID
objidoid任何 OID 屬性指定的有依賴對象的 OID
objsubidint4 對于表字段,這個是該屬性的字段數(objidclassid引用表本身)。 對于所有其他對象類型,目前這個字段是零。
refclassidoidpg_class.oid被引用對象所在的系統表的 oid
refobjidoid任意 OID 屬性指定的被引用對象的 OID
refobjsubidint4  對于表字段,這個是該字段的字段號(objidclassid引用表本身)。 對于所有其他對象類型,目前這個字段是零。
deptypechar  一個定義這個依賴關系特定語義的代碼。見文本。

在所有情況下,一個 pg_depend 記錄表示 被引用的對象不能在有依賴的對象被刪除前刪除。不過,這裡還有幾種 由 deptype 定義的情況:

DEPENDENCY_NORMAL (n)

獨立創建的對象之間的一般關系。 有倚賴的對象可以在不影響被引用對象的情況下刪除。被引用對象 只有在聲明了CASCADE的情況下刪除,這時有依賴的對象也被刪除。 例子:一個表字段對其數據類型有一般依賴關系。

DEPENDENCY_AUTO (a)

有依賴對象可以和被引用對象分別刪除, 並且如果刪除了被引用對象則應該被自動刪除(不管是RESTRICT還是CASCADE模式)。 例子:一個表上面的命名約束是在該表上的自動依賴關系,因此 如果刪除了表,它也會被刪除。

DEPENDENCY_INTERNAL (i)

有依賴的對象是作為被引用對象的一部分創建的, 實際上只是它的內部實現的一部分。DROP有依賴對象是不能直接允許的(我們 將告訴用戶發出一條刪除被引用對象的DROP)。一個對被引用對象的DROP 將傳播到有依賴對象,不管是否聲明了CASCADE。 例子:一個創建來強制外鍵約束的觸發器在該約束的pg_constraint 記錄上是標記為內部依賴的。

DEPENDENCY_PIN (p)

沒有有依賴對象;這種類型的記錄標志著系統本身依賴 于被引用對象,因此這個對象決不能被刪除。這種類型的記錄只有在initdb的 時候創建。有依賴對象的字段裡是零。

將來可能還會有其他依賴的風格。