pg_depend
#目录 pg_depend
记录数据库对象之间的依赖关系。此信息允许 DROP
命令找到哪些其他对象必须通过 DROP CASCADE
删除,或者在 DROP RESTRICT
的情况下防止删除。
另请参阅 pg_shdepend
,它对涉及跨数据库集群共享的对象的依赖关系执行类似的功能。
表 51.18. pg_depend
列
列名 类型 描述 |
---|
依赖对象所在的系统目录的 OID |
特定依赖对象的 OID |
对于表列,这是列号 ( |
被引用对象所在的系统目录的 OID |
特定被引用对象的 OID |
对于表列,这是列号 ( |
一个定义此依赖关系特定语义的代码;请参阅文本 |
在所有情况下,pg_depend
条目都表示,如果不删除依赖对象,则不能删除被引用对象。但是,有几种由 deptype
标识的子类型
DEPENDENCY_NORMAL
(n
)单独创建的对象之间的正常关系。依赖对象可以被删除,而不会影响被引用对象。只有指定 CASCADE
,才能删除被引用对象,在这种情况下,也会删除依赖对象。示例:表列对其数据类型具有正常依赖关系。
DEPENDENCY_AUTO
(a
)依赖对象可以与被引用对象分开删除,如果被引用对象被删除,则应自动删除(无论 RESTRICT
还是 CASCADE
模式)。示例:表上的命名约束自动依赖于该表,因此如果该表被删除,它将消失。
DEPENDENCY_INTERNAL
(i
)依赖对象是作为创建被引用对象的一部分创建的,并且实际上只是其内部实现的一部分。将完全不允许直接 DROP
依赖对象(我们会告诉用户改为针对被引用对象发出 DROP
)。DROP
被引用对象将导致自动删除依赖对象,无论是否指定 CASCADE
。如果由于删除了对其他对象的依赖关系而必须删除依赖对象,则其删除将转换为删除被引用对象,以便依赖对象的 NORMAL
和 AUTO
依赖关系的行为就像它们是被引用对象的依赖关系一样。示例:视图的 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
条目链接。例如,一个子分区索引将同时拥有对其关联的分区表的 partition-type 依赖,以及对其索引的该表的每个列的自动依赖。这种情况表达了多种依赖语义的联合。如果其任何依赖关系满足其自动删除的条件,则可以删除一个依赖对象而无需使用 CASCADE
。反之,必须满足所有依赖关系关于哪些对象必须一起删除的限制。
在 initdb 期间创建的大多数对象都被认为是“已钉住”的,这意味着系统本身依赖于它们。因此,永远不允许删除它们。此外,由于已知已钉住的对象不会被删除,依赖机制不会费心创建 pg_depend
条目来显示对它们的依赖关系。因此,例如,一个 numeric
类型的表列在概念上对 numeric
数据类型具有 NORMAL
依赖关系,但实际上在 pg_depend
中不会出现这样的条目。
如果您发现文档中有任何不正确、与您使用特定功能的经验不符或需要进一步澄清的地方,请使用此表单报告文档问题。