更新时间:2023-04-23 GMT+08:00

PG_DEPEND

PG_DEPEND系统表记录数据库对象之间的依赖关系。这些信息允许DROP命令找出哪些其它对象必须由DROP CASCADE删除,或者是在DROP RESTRICT的情况下避免删除。

另请参考PG_SHDEPEND,对于记录那些在数据库集群之间共享的对象之间的依赖性关系提供了相似的功能。

表1 PG_DEPEND字段

名字

类型

引用

描述

classid

oid

PG_CLASS.oid

依赖对象所在系统表的OID。

objid

oid

任意OID属性

指定依赖对象的OID。

objsubid

integer

-

对于表字段,是该属性的字段数(objid和classid引用表本身)。对于所有其它对象类型,此字段是0。

refclassid

oid

PG_CLASS.oid

被引用对象所在的系统表的OID。

refobjid

oid

任意OID属性

指定的被引用对象的OID。

refobjsubid

integer

-

对于表字段,是该字段的字段号(refobjid和refclassid引用表本身)。对于所有其它对象类型,此字段是零。

deptype

"char"

-

定义此依赖关系特定语义的代码。

在所有情况下,一个PG_DEPEND记录表示被引用对象不能在没有删除依赖对象的情况下被删除。但是其中也有几种由deptype定义的情况:

  • DEPENDENCY_NORMAL (n):独立创建的对象之间的一般关系。依赖对象可以在不影响被引用对象的情况下删除。被引用对象只能通过指定CASCADE被删除,这种情况下依赖对象也会被删除。例如:一个表字段对其数据类型有一般依赖关系。
  • DEPENDENCY_AUTO (a):依赖对象可以和被引用对象分别删除,且在被引用对象被删除时应自动被删除(不管是RESTRICT或CASCADE模式)。例如:一个表上的命名约束是该表上的自动依赖关系,因此如果删除了表,它也会被删除。
  • DEPENDENCY_INTERNAL (i):依赖对象作为被引用对象过程的一部分创建,且是其内部实现的一部分。 DROP依赖对象是不会直接允许的(会给户发出一个针对被引用对象的DROP)。不管是否指定CASCADE,一个被引用对象的DROP将被传播来删除其依赖对象。例如:一个用于强制外键约束的触发器将被设置为内部依赖于其约束的PG_CONSTRAINT项。
  • DEPENDENCY_EXTENSION (e):依赖对象作为被依赖对象extension的一个成员(请参见PG_EXTENSION)。依赖对象可以通过在被依赖对象上DROP EXTENSION删除。在功能上,这种依赖类型和内部依赖的作用相同,其存在只是为了清晰和简化gs_dump。
  • DEPENDENCY_PIN (p):没有依赖对象。这种类型的记录标志着系统本身依赖于被引用对象,因此这个对象决不能被删除。这种类型的记录只有在initdb的时候创建。有依赖对象的字段都为0。

应用示例

查询名为serial1的数据库对象sequence和哪个表有依赖关系。

  1. 先通过系统表PG_CLASS查询序列名为serial1的oid。
    1
    2
    3
    4
    5
    SELECT oid FROM pg_class WHERE relname ='serial1';
      oid
    -------
     17815
    (1 row)
    
  2. 使用系统表PG_DEPEND根据所查询的序列serial1的oid获取依赖该序列的对象。
    1
    2
    3
    4
    5
    6
    SELECT * FROM pg_depend WHERE objid ='17815';
     classid | objid | objsubid | refclassid | refobjid | refobjsubid | deptype
    ---------+-------+----------+------------+----------+-------------+---------
        1259 | 17815 |        0 |       2615 |     2200 |           0 | n
        1259 | 17815 |        0 |       1259 |    17812 |           1 | a
    (2 rows)
    
  3. 根据字段refobjid获取依赖该序列serial1的表的OID,并查询到表名。其结果表示,序列serial1依赖于表customer_address。
    1
    2
    3
    4
    5
    SELECT relname FROM pg_class where oid='17812';
         relname
    ------------------
     customer_address
    (1 row)