Postgresql 中文操作指南

53.18. pg_depend #

目录 pg_depend 记录了数据库对象之间的依赖关系。此信息允许 DROP 命令找到必须由 DROP CASCADE 删除的其它对象,或在 DROP RESTRICT 情况下防止删除。

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

Table 53.18. pg_depend Columns

Column Type

Description

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)

    • 依赖对象是引用对象 extension 的成员(请参阅 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 中。