51.18. pg_depend

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

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

表 51.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_EXTENSION (e)

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

DEPENDENCY_AUTO_EXTENSION (x)

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

DEPENDENCY_PIN (p)

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

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