Skip to content

53.18.pg_depend#

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

另请参见pg_shdepend,它对涉及跨数据库集群共享的对象的依赖关系执行类似的功能。

表 53.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)

可以单独删除从属对象,如果删除引用对象,则应自动删除从属对象(无论 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 的目的,它被单独保留。

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

请注意,两个对象完全有可能通过多个pg_depend条目链接。例如,一个子分区索引与其关联的分区表既有分区类型依赖,又有对其索引的该表中的每一列的自动依赖。这种情况下表示了多个依赖语义的并集。如果依赖对象的任何依赖满足其自动删除条件,则可以在没有CASCADE的情况下删除该依赖对象。相反,必须满足所有依赖项关于必须一起删除哪些对象的限制。

在initdb期间创建的大多数对象都被认为是“固定的”,这意味着系统本身依赖于它们。因此,它们永远不允许被删除。此外,由于知道固定的对象不会被删除,因此依赖机制不会费心于创建显示对它们的依赖的pg_depend条目。因此,例如,类型为numeric的表列在概念上对numeric数据类型具有NORMAL依赖,但实际上pg_depend中没有这样的条目。