45.34. pg_shdepend

pg_shdepend表记录数据库对象和共享对象(比如角色)之间的依赖性关系。 这些信息允许PostgreSQL保证在企图删除这些对象之前,没有引用这些对象。

pg_depend表的作用类似,只是它是用于在一个单数据库内部的对象的依赖性关系的。

和其它大多数系统表不同,pg_shdepend是在集群里面所有的数据库之间共享的: 每个数据库集群只有一个pg_shdepend的副本,而不是每个数据库一个。

Table 45-34. pg_shdepend Columns

名称类型引用描述
dbidoidpg_database.oid 依赖对象所在的数据库的OID,如果是共享对象,则为零
classidoidpg_class.oidThe OID of the system catalog the dependent object is in依赖对象所在的系统表的OID
objidoid任何OID列指定依赖对象的OID
objsubidint4  表列,这是列号( objidclassid指 表本身)。对于所有其它对象类型,这个字段是零。
refclassidoidpg_class.oid引用对象所在的系统表的OID(必须是一个共享表)
refobjidoid任何OID列指定引用对象的OID
deptypechar  一段代码,定义了这个依赖性关系的特定语义;参阅下文。

在任何情况下,一条pg_shdepend记录就表示这个引用的对象不能在未删除依赖对象的前提下删除。 不过,deptype同时还标出了几种不同的子风格:

SHARED_DEPENDENCY_OWNER (o)

引用的对象(必须是一个角色)是依赖对象的所有者。

SHARED_DEPENDENCY_ACL (a)

引用的对象(必须是一个角色)在依赖对象的ACL(访问控制列表, 也就是权限列表)里提到。SHARED_DEPENDENCY_ACL不会在对象的所有者头上添加的, 因为所有者会有一个SHARED_DEPENDENCY_OWNER记录。

SHARED_DEPENDENCY_PIN (p)

没有依赖对象;这类记录标识系统自身依赖于该引用对象, 因此这样的对象绝对不能被删除。这种类型的记录只是由initdb创建。 这样的依赖对象的字段包含零。

在将来可能会需要其它依赖性的风格。请注意,目前的定义只是支持把角色当作引用对象。