🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 47.40\. `pg_shdepend` `pg_shdepend`记录数据库对象和共享对象(比如角色)之间的依赖性关系。 这些信息允许PostgreSQL保证在企图删除这些对象之前, 这些对象是没有被引用的。 [`pg_depend`](#calibre_link-680)表的作用类似, 只是它是用于在一个数据库内部的对象的依赖性关系的。 和其它大多数系统表不同,`pg_shdepend`是在集群里面所有的数据库之间共享的: 每个数据库集群只有一个`pg_shdepend`,而不是每个数据库一个。 **Table 47-40\. `pg_shdepend` 字段** | 名字 | 类型 | 引用 | 描述 | | --- | --- | --- | --- | | `dbid` | `oid` | `pg_database`.oid | 依赖对象所在的数据库的 OID ,如果是共享对象,则为零 | | `classid` | `oid` | `pg_class`.oid | 依赖对象所在的系统表的 OID | | `objid` | `oid` | 任意 oid 属性 | 指定的依赖对象的 OID | | `objsubid` | `int4` | 对于一个表字段,这是字段号(`objid`和`classid` 参考表本身)。对于所有其他对象类型,这个字段为零。 | | `refclassid` | `oid` | `pg_class`.oid | 被引用对象所在的系统表的 OID(必须是一个共享表) | | `refobjid` | `oid` | 任意 oid 属性 | 指定的被引用对象的 OID | | `deptype` | `char` | 一段代码,定义了这个依赖性关系的特定语义;参阅下文。 | 在任何情况下,一条`pg_shdepend` 记录就表明这个被引用的对象不能在未删除依赖对象的前提下删除。 不过,`deptype`同时还标出了几种不同的子风格: `SHARED_DEPENDENCY_OWNER` (`o`) 被引用的对象(必须是一个角色)是依赖对象的所有者。 `SHARED_DEPENDENCY_ACL` (`a`) 被引用的对象(必须是一个角色)在依赖对象的 ACL(访问控制列表,也就是权限列表)里提到。 `SHARED_DEPENDENCY_ACL`不会在对象的所有者头上添加的,因为所有者会有一个 `SHARED_DEPENDENCY_OWNER`记录。 `SHARED_DEPENDENCY_PIN` (`p`) 没有依赖对象;这类记录标识系统自身依赖于该被依赖对象,因此这样的对象绝对不能被删除。 这种类型的记录只是由`initdb`创建。这样的依赖对象的字段都是零。 其它依赖性的风格可能在将来会出现。请注意,目前的定义只是支持把角色当作被引用对象。