2025年9月25日: PostgreSQL 18 发布!
支持的版本: 当前 (18) / 17 / 16 / 15 / 14 / 13
开发版本: devel
不支持的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3

52.18. pg_depend #

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

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

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

依赖对象可以独立于被引用对象删除,并且在删除被引用对象时(无论 RESTRICT 还是 CASCADE 模式)应该自动删除。例如:表上的命名约束会自动依赖于表,以便在表被删除时它也会消失。

DEPENDENCY_INTERNAL (i)

依赖对象是在创建被引用对象时作为其一部分创建的,并且实际上只是其内部实现的一部分。直接 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 期间创建的大多数对象都被视为 固定“pinned”),这意味着系统本身依赖于它们。因此,它们永远不允许被删除。此外,由于知道固定对象不会被删除,因此依赖机制不会创建显示对它们的依赖关系的 pg_depend 条目。因此,例如,类型为 numeric 的表列名义上与 numeric 数据类型存在 NORMAL 依赖关系,但 pg_depend 中实际上并没有此类条目。

提交更正

如果您在文档中发现任何不正确、与您使用特定功能的经验不符或需要进一步澄清的内容,请使用 此表单 报告文档问题。