Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16 / 17

51.18. pg_depend #

目录 pg_depend 记录数据库对象之间的依赖关系。这些信息让 DROP 命令找到哪些其他人必须像 DROP CASCADE 一样被删除,或在 DROP RESTRICT 情况中阻止删除。

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

表 51.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)。引用对象的DROP将导致自动删除从属对象,无论是否指定CASCADE。如果必须删除从属对象,因为其他对象被删除之后有依赖关系,则将其删除转换为删除引用对象,以便从属对象的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 中实际上没有出现此类条目。