pg_depend

pg_depend

pg_depend系统目录表记录数据库对象之间依赖关系。 此信息允许DROP命令查找哪些其他对象必须由DROP CASCADE删除或者必须防止在DROP RESTRICT情况中被删除。 另请参见pg_shdepend,它对涉及Greenplum系统共享对象的依赖执行类似的功能。

在所有的情况下,pg_depend项表示在不删除依赖对象的前提下也不能删除被引用对象。 不过,有几种由deptype区分的子类型:

  • DEPENDENCY_NORMAL (n) — 单独创建的对象之间的正常关系。 可以删除依赖对象而不影响被引用的对象。 被引用对象只能通过指定CASCADE来删除,在这种情况下依赖对象也会被删除。 例如:表列对其数据类型具有正常的依赖性。
  • DEPENDENCY_AUTO (a) — 依赖对象可以独立于被引用对象而删除,并且如果被引用对象被删除,则依赖对象应该自动被删除(不管是RESTRICT还是CASCADE模式)。 例如:表上的命名约束自动依赖表,因此如果表被删除,该约束也将消失。
  • DEPENDENCY_INTERNAL (i) — 依赖对象作为被引用对象的一部分创建,实际只是其内部实现的一部分。 依赖对象的DROP操作将被完全禁止(我们会告诉用户针对被引用对象发出DROP命令来代替)。 被引用对象的DROP命令会被传播以删除依赖对象,不管是否指定CASCADE(级联删除)。
  • DEPENDENCY_PIN (p) — 没有依赖对象; 这种类型的条目是系统本身依赖于引用对象的信号,因此绝不能删除该对象。 此类型的条目仅由系统初始化创建。 从属对象的列包含零。
    Table 1. pg_catalog.pg_depend
    类型 参考 描述
    classid oid pg_class.oid 依赖对象所在的系统目录的OID。
    objid oid any OID column 特定依赖对象的OID。
    objsubid int4   对于表列,这是列编号。 对于其他对象类型,此列为0。
    refclassid oid pg_class.oid 被引用对象所在的系统目录的OID。
    refobjid oid any OID column 特定被引用对象的OID。
    refobjsubid int4   对于表列,这是被引用的列编号。 对于其他对象类型,该列为0。
    deptype char   定义此依赖关系的特定语义的代码。