↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 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
历史版本。 PostgreSQL 13 已结束支持。 2025-11-13. 请参阅 当前版本手册.

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

对于一个表列,这里是列号(objid 和 classid 指表本身)。对于所有其他对象类型,此列为 0。

refclassid oid(引用 pg_class.oid)

被引用对象所在的系统目录的 OID

refobjid oid(引用任何 OID 列)

指定被引用对象的 OID

refobjsubid int4

对于一个表列,这里是列号(refobjid 和 refclassid 指表本身)。对于所有其他对象类型,此列为 0。

deptype char

定义此依赖关系语义的一个代码,见下文


在所有情况下,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)

依赖对象是作为被引用对象的扩展(extension)的一个成员(参见 pg_extension)。依赖对象只能通过被引用对象上的 DROP EXTENSION 来删除。在功能上,这种依赖类型与 INTERNAL 依赖相同,但为了清晰和简化 pg_dump 而保持分开。

DEPENDENCY_AUTO_EXTENSION(x)

依赖对象不是作为被引用对象的扩展的成员(因此不应被 pg_dump 忽略),但它无法在没有扩展的情况下运行,如果扩展被删除,它应该被自动删除。依赖对象也可以单独删除。从功能上讲,这种依赖类型与 AUTO 依赖相同,但为了清晰起见和简化 pg_dump,它被保持分开。

DEPENDENCY_PIN (p)

不存在依赖对象;这种项表示系统本身依赖于被引用对象,因此该对象绝不能删除。这种项只由 initdb 创建。用于表示依赖对象的各列包含零。

未来可能需要其他依赖关系的变种。

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

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.