PostgreSQL 中文参考文档
🌐 英文原版 官方 ↗

52.18. pg_depend #

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

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

Table 52.18. \1 字段列说明

Column Type

Description

classid oid (references pg_class.oid)

依赖对象所在的系统目录的 OID

objid oid (引用任意 OID 列)

依赖的具体对象的 OID

objsubid int4

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

refclassid oid (references pg_class.oid)

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

refobjid oid (引用任意 OID 列)

被引用的具体对象的 OID

refobjsubid int4

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

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)

依赖对象是作为被引用对象的 扩展的成员(见 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 中实际上并不出现这样的条目。