52.18. pg_depend

目录pg_depend记录数据库对象之间的依赖关系。这些信息允许DROP命令查找必须被DROP CASCADE删除的其他对象,或者在DROP RESTRICT情况下阻止删除。

另请参阅pg_shdepend,它对在一个数据库集簇中共享的对象之间的依赖提供了相似的功能。

Table 52.18. pg_depend的列

名称类型引用描述
classidoidpg_class.oid依赖对象所在的系统目录OID
objidoidany OID column指定依赖对象的OID
objsubidint4  对于一个表列,这里是列号(objidclassid指表本身)。对于所有其他对象类型,此列为0。
refclassidoidpg_class.oid被引用对象所在的系统目录的OID
refobjidoidany OID column指定被引用对象的OID
refobjsubidint4  对于一个表列,这里是列号(refobjidrefclassid指表本身)。对于所有其他对象类型,此列为0。
deptypechar  定义此依赖关系语义的一个代码,见文本

在所有情况下,一个pg_depend项表明被引用对象不能在没有删除其依赖对象的情况下被删除。但是,其中也有多种依赖类型,由deptype标识:

DEPENDENCY_NORMAL (n)

在独立创建的对象之间的一个普通关系。依赖对象可以在不影响被依赖对象的情况下被删除。被引用对象只能通过指定CASCADE被删除,在这种情况下依赖对象也会被删除。 例子:一个表列对于其数据类型有一个普通依赖。

DEPENDENCY_AUTO (a)

依赖对象可以被独立于被依赖对象删除,且应该在被引用对象被删除时自动被删除(不管在RESTRICTCASCADE模式)。例子:一个表上的一个命名约束应该被设置为自动依赖于表,这样在表被删除后它也会消失。

DEPENDENCY_INTERNAL (i)

依赖对象作为被引用对象创建过程的一部分被创建,并且只是其内部实现的一部分。一个依赖对象的DROP会被直接拒绝(作为替代,我们将告诉用户发出一个针对被引用对象的DROP)。不管是否指定CASCADE,一个被引用对象的DROP将被传播来删除其依赖对象。例子:一个用于强制外键约束的触发器将被设置为内部依赖于其约束的pg_constraint项。

DEPENDENCY_INTERNAL_AUTO (I)

依赖对象被作为被引用对象创建过程的一部分创建,并且确实是其内部实现的一部分。依赖对象的DROP将彻底被禁止(我们将告诉用户应该在被引用对象上发出DROP)。虽然一个常规的内部依赖将阻止依赖对象在任何这类依赖还存在的情况下被删除,当DEPENDENCY_INTERNAL_AUTO会允许这类删除,只要能顺着任一这类依赖找到该对象就行。例子:一个分区上的索引对分区本身和父分区表上的所有都有内部自动依赖,那么该分区索引会被和它索引的分区一起删除,或者和它所附着的父索引一起被删除。

DEPENDENCY_EXTENSION (e)

依赖对象是作为扩展的被引用对象的一个成员(参见pg_extension)。依赖对象可以通过被引用对象上的DROP EXTENSION来删除。在功能上,这种依赖类型和一个内部依赖的作用相同,其存在只是为了清晰和简化pg_dump

DEPENDENCY_AUTO_EXTENSION (x)

依赖对象不是作为被引用对象的扩展的成员(因此不应该被 pg_dump 忽略),但是没有被引用对象又无法工作,所以当扩展本身被删除时也应该把该依赖对象删除。该依赖对象也可以自己被删除。

DEPENDENCY_PIN (p)

没有依赖对象,这种类型的项是一个信号,用于说明系统本身依赖于被引用对象,并且该对象永远不能被删除。这种类型的项只能被initdb创建。而此种项的依赖对象的列都为0。

在未来可能会需要其他依赖类型。