2024 年 9 月 26 日: PostgreSQL 17 发布!
支持的版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:devel
不支持的版本: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

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 操作:只需要添加或删除分区依赖关系。例如:子分区索引在它所在的 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 中没有这样的条目。

提交更正

如果您在文档中看到任何不正确的内容,不符合您对特定功能的体验,或者需要进一步说明,请使用 此表格 报告文档问题。