9.3 9.4 9.5 9.6 10 11 12 13
阿里云PostgreSQL 问题报告 纠错本页面

51.18. pg_depend

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

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

表 51.18. pg_depend的列

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

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

DEPENDENCY_NORMAL (n)

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

DEPENDENCY_AUTO (a)

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

DEPENDENCY_INTERNAL (i)

依赖对象作为被引用对象创建过程的一部分被创建,并且只是其内部实现的一部分。不允许直接DROP所依赖的对象(而是告诉用户对引用对象发出DROP操作)。无论是否指定了CASCADEDROP被引用的对象都将导致自动删除从属对象。如果由于删除了对某些其他对象的依赖关系而不得不删除依赖对象,则其删除将转换为对所引用对象的删除,因此依赖对象的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,将其分开。

DEPENDENCY_PIN (p)

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

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

要注意的是,两个对象很有可能由不止一个pg_depend条目来链接。例如子分区索引有一个依赖于其关联的分区表的分区类型的依赖关系和依赖于该表索引的每一列的自动依赖关系。此类情形表示多重依赖关系语义的并集,依赖对象的删除可以没有CASCADE,如果其任一依赖关系满足自动删除的条件。相反地,关于哪些对象必须一起删除的所有依赖关系的限制必须满足。