🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 47.19\. `pg_depend` `pg_depend`表记录数据库对象之间的依赖关系。 这个信息允许`DROP`命令找出哪些其它对象必须由`DROP CASCADE`删除, 或者是在`DROP RESTRICT`的情况下避免删除。 这个表的功能类似[`pg_shdepend`](#calibre_link-686), 用于记录那些在数据库集群之间共享的对象之间的依赖性关系。 **Table 47-19\. `pg_depend` 字段** | 名字 | 类型 | 引用 | 描述 | | --- | --- | --- | --- | | `classid` | `oid` | `pg_class`.oid | 有倚赖对象所在系统表的 OID | | `objid` | `oid` | 任意 OID 属性 | 指定的依赖对象的 OID | | `objsubid` | `int4` | 对于表字段,这个是该属性的字段数(`objid`和`classid` 引用表本身)。对于所有其它对象类型,目前这个字段是零。 | | `refclassid` | `oid` | `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`。 例子:一个创建来强制外键约束的触发器在该约束的`pg_constraint`记录上是标记为内部依赖的。 `DEPENDENCY_EXTENSION` (`e`) 依赖对象是被依赖对象_extension_的一个成员(参阅 [`pg_extension`](#calibre_link-687))。 依赖对象只可以通过在被依赖对象上`DROP EXTENSION`删除。 函数上这个依赖类型和内部依赖一样动作,但是它为了清晰和简化pg_dump保持分开。 `DEPENDENCY_PIN` (`p`) 没有有依赖对象;这种类型的记录标志着系统本身依赖于被引用对象,因此这个对象决不能被删除。 这种类型的记录只有在`initdb`的时候创建。有依赖对象的字段里是零。 将来可能还会有其它依赖的风格。